Guild icon
swift-developers-japan
main / swift-zatsu
Avatar
norio_nomura 01-Nov-17 12:24 PM
Xcode 9.1で4.0.2がリリースされたけど、リポジトリには4.0.1, 4.0.2のリリースタグが付かないですね。 swift-4.0-branch にはバージョン変更入ってるのに。 https://github.com/apple/swift/compare/swift-4.0-RELEASE...swift-4.0-branch
swift - The Swift Programming Language
Avatar
norio_nomura 02-Nov-17 12:21 PM
swift-4.0.2-RELEASE来てた。
Avatar
lovee 06-Nov-17 08:48 AM
StringStringProtocol だけど NumberNumeric なんですね… https://developer.apple.com/documentation/swift/numeric
Avatar
omochimetaru 06-Nov-17 08:49 AM
XxxProtocol は Xxx をそのままプロトコル化したやつで
Numeric はまた違うんじゃ?
Avatar
lovee 06-Nov-17 08:50 AM
なんか微妙に気持ち悪いというかなんというか…?
Avatar
omochimetaru 06-Nov-17 08:50 AM
Numericはもととなる型があるわけじゃなくてそれ単体で設計された何かなのでは
Avatar
lovee 06-Nov-17 08:51 AM
StringProtocol 以外の XxxProtocol って何があります?
Avatar
Avatar
hiragram 06-Nov-17 08:52 AM
NSObjectProtocol
Avatar
tarunon 06-Nov-17 08:52 AM
Avatar
omochimetaru 06-Nov-17 08:52 AM
(早押しクイズかな
Avatar
tarunon 06-Nov-17 08:52 AM
一番有名で一番邪悪
Avatar
hiragram 06-Nov-17 08:52 AM
そw
Avatar
tarunon 06-Nov-17 08:52 AM
NSObjectProtocolこれ入れるとヘッダーには書いてないけど暗黙的にclass扱いになってる気がするんだよね
Avatar
hiragram 06-Nov-17 08:52 AM
ん?
Avatar
lovee 06-Nov-17 08:53 AM
IteratorProtocol 普通にわすれてたw NSObjectProtocol なんてあるのかぁ(白目
Avatar
hiragram 06-Nov-17 08:54 AM
@tarunon https://developer.apple.com/documentation/objectivec/nsobjectprotocol
An object that conforms to this protocol can be considered a first-class object. Such an object can be asked about its:
Class, and the place of its class in the inheritance hierarchy. Conformance to protocols. Ability to respond to a particular message. The Cocoa root class NSObject adopts this protocol, so all objects inheriting from NSObject have the features described by this protocol.
クラスとして振る舞うのに必要な要素がNSObjectProtocolに入ってる、って感じかしら
Avatar
tarunon 06-Nov-17 08:54 AM
んにゃ、NSObjectとして振る舞う、だね
Avatar
hiragram 06-Nov-17 08:55 AM
ああ、そうね
Avatar
omochimetaru 06-Nov-17 08:55 AM
なんちゃらProtocol、意外と無いな
Avatar
hiragram 06-Nov-17 08:55 AM
暗黙的にclass扱いってどういうことだろう
Avatar
tarunon 06-Nov-17 08:55 AM
ヘッダーでは
public protocol NSObjectProtocol {
ってなってるのに、実際の動きは
public protocol NSObjectProtocol: class {
なんじゃあないのっていうのが各所で浮き出てくる
(edited)
Avatar
omochimetaru 06-Nov-17 08:56 AM
↑ mutating func とか絡めてみれば確認できそう
Avatar
tarunon 06-Nov-17 08:57 AM
なお
Avatar
hiragram 06-Nov-17 08:57 AM
@tarunon 浮き出てくるっていうのは実行時の振る舞いの話?
Avatar
tarunon 06-Nov-17 08:57 AM
コンパイラの振る舞い
Avatar
hiragram 06-Nov-17 08:57 AM
ああー
Avatar
omochimetaru 06-Nov-17 08:57 AM
IteratorProtocol は、 Sequence.Iterator (associatedtype) との Iterator っていう 名前衝突を避けたくてそうなった感があるけどね・・・
Avatar
hiragram 06-Nov-17 08:57 AM
それは :class を書いたときと同じやつか
Avatar
tarunon 06-Nov-17 08:57 AM
そう、そうであるべきなのに書いてなくて卑怯だな~~ってなる
Avatar
Kishikawa Katsumi 06-Nov-17 08:57 AM
NSObjectProtocolはObjCのプロトコルだからじゃないかな。
Avatar
omochimetaru 06-Nov-17 08:57 AM
あ〜
Avatar
hiragram 06-Nov-17 08:57 AM
UITableVIewDelegateとかも確かそうじゃなかった?
classって書いてあったっけあれ
Avatar
tarunon 06-Nov-17 08:58 AM
@objcつけたらclass矯正されるのと同じ感じですかね
Avatar
Kishikawa Katsumi 06-Nov-17 08:58 AM
Swift以前からある、
Avatar
omochimetaru 06-Nov-17 08:58 AM
objc側からimportされてるプロトコルは全部そうなのか。
Avatar
tarunon 06-Nov-17 08:58 AM
@objc明示ルール出来たのにNSObjectProtocolはそうじゃないっていうのもね
卑怯ポイント高い
Avatar
hiragram 06-Nov-17 08:59 AM
UITableViewDelegateはNSObjectProtocolを継承(?)してた。
Avatar
tarunon 06-Nov-17 09:00 AM
Basic Arithmetic、日本語でなんてんだ
Avatar
hiragram 06-Nov-17 09:00 AM
四則演算?
違うか?
Avatar
omochimetaru 06-Nov-17 09:01 AM
> Weblio専門用語対訳辞書での「basic arithmetic operations」の意味 Basic arithmetic operations 四則演算
Avatar
hiragram 06-Nov-17 09:01 AM
💪 ('ω' 💪 ) (edited)
😯 1
👏 1
Avatar
tarunon 06-Nov-17 09:03 AM
あー
継承はExtends、protocolの場合はどれだと思ってたら違うところ見てた。> Inherits こっちかな
Avatar
hiragram 06-Nov-17 09:04 AM
継承はinheritだね
Avatar
tarunon 06-Nov-17 09:04 AM
あれれ
Avatar
hiragram 06-Nov-17 09:04 AM
extendはどっちかというと拡張
= extension
Avatar
lovee 06-Nov-17 09:04 AM
protocolはconformじゃない?
Avatar
tarunon 06-Nov-17 09:04 AM
英語力の低さが露呈している
Avatar
omochimetaru 06-Nov-17 09:04 AM
Relationships Inherits From Equatable, ExpressibleByIntegerLiteral Inherited By BinaryInteger, SignedNumeric
Avatar
hiragram 06-Nov-17 09:04 AM
プロトコルも継承でいいんでねたぶん
Avatar
omochimetaru 06-Nov-17 09:04 AM
ドキュメント的には protocol のページだと inherit
満たしてるProtocolについては conforms だったと思う
Avatar
hiragram 06-Nov-17 09:06 AM
プロトコルAと実装Bの関係がB conforms to AでプロトコルAの性質を引き継ぐプロトコルBはB inherits from Aのイメージだなあ (edited)
Avatar
lovee 06-Nov-17 09:06 AM
protocolが別のprotocolを継承している場合は inherits、何かの型がprotocolに準拠している場合は conforms、多分これで問題ないかと…?
Avatar
Kishikawa Katsumi 06-Nov-17 09:06 AM
Inherit, conform, extend, adoptのどれも同じ意味で使われることありますよ。アップルのドキュメント
Avatar
tarunon 06-Nov-17 09:06 AM
キビシー
Avatar
Kishikawa Katsumi 06-Nov-17 09:07 AM
たぶん決まりはない、、、あるかもしれないけど書く人で変わるくらいのものじゃないかな。
Avatar
omochimetaru 06-Nov-17 09:07 AM
https://developer.apple.com/documentation/swift/int あー、僕が言っていたのは文章中の英単語のことじゃなくて、↑の形式のリファレンスの、一番下の方にある機械的に書かれてるっぽいやつのことです
Relationships セクションの中のサブセクションのタイトル。 (edited)
Avatar
lovee 06-Nov-17 09:08 AM
Int は型だから protocolConforms To ですね
Avatar
omochimetaru 06-Nov-17 09:08 AM
Conforms To の逆参照が Adopted From として掲載されてるっぽい
Avatar
hiragram 06-Nov-17 09:09 AM
意味的にもそれがしっくりくるね
Avatar
omochimetaru 06-Nov-17 09:09 AM
protocol 同士は Inherited From と Inherited To (edited)
Avatar
lovee 06-Nov-17 09:09 AM
Inherits from ですね
Avatar
lovee 07-Nov-17 09:44 AM
C#のAbstract Class欲しいなぁと改めて思った https://qiita.com/taketo1024/items/71e3272211f08d7e0cde
社内の「Scala 勉強会」で Phantom Type (幽霊型) という厨二心をくすぐる感じのデザインパターンを教えてもらったので、同じことを Swift でもやってみました。 インスタンスの状態を変数ではなく **型パ...
この例、Statusabstract class で定義できたらなぁとすごい思う
Avatar
omochimetaru 07-Nov-17 09:45 AM
あーなるほど。
この場合は、 依存型が入ってくれれば、 Status を enum にすればいいですけどね〜
Avatar
lovee 07-Nov-17 09:46 AM
Javaのあの依存型ですか?
Avatar
omochimetaru 07-Nov-17 09:46 AM
依存型は型パラメータに値が書けるやつです
例えば・・・
struct StackArray<value Size: Int> { ... }
みたいなノリ
Avatar
lovee 07-Nov-17 09:47 AM
stateパターンというか列挙されたstrategyパターンというか。 ## 環境 - xcode 9.0 - swift4 ## 問題 ### swiftのenumは要素ごとに振る舞いを定義できない ひたすらswitch文を使...
Avatar
omochimetaru 07-Nov-17 09:47 AM
var a = StackArray<2>() a.0 // ok a.1 // ok a.2 // compile error
(edited)
Avatar
lovee 07-Nov-17 09:48 AM
StackArray 欲しいw
Avatar
omochimetaru 07-Nov-17 09:48 AM
↑のtaketoさんの記事なら、
enum Status { case NotReady case Ready } class Something<value T: Status> { /*中身は同じでOK*/ }
(edited)
Avatar
koher 07-Nov-17 09:50 AM
編集リクエストを出しては?
Avatar
omochimetaru 07-Nov-17 09:50 AM
いまのSwiftには無いですよ
Avatar
koher 07-Nov-17 09:51 AM
ああ、後ろが value T: Status になってるのか。 (edited)
Avatar
Avatar
koher 07-Nov-17 09:51 AM
Statusprotocol じゃダメなんだっけ? sealed にできない?
Avatar
omochimetaru 07-Nov-17 09:52 AM
↑最近のスレ
protocol だとユーザが追加した値が入れられちゃいますね あ、abstract class でもその点がダメだな
- Now you can define a “dependent type”, for example ModuloInteger<P>, where P is the integer value that defines the type. - Like this, you’ll have: —> MI<2>: {0, 1}, where 1 + 1 = 0. —> MI<3>: {0, 1, 2}, where 1 + 1 = 2, and 2 • 2 = 1
Avatar
lovee 07-Nov-17 09:52 AM
Statusprotocol でもダメってことはないですが、Something<NotReady>.createInstance() で書かないといけないのがイケてないですね
Avatar
omochimetaru 07-Nov-17 09:53 AM
↑ P で割ったあまり を表す型 ModuloInteger<P> の例 、型パラのところに2 とか 3とかの 「値」が入る
Avatar
koher 07-Nov-17 09:53 AM
Vector<2> とか Matrix<4, 4> とかやりたい。
Avatar
omochimetaru 07-Nov-17 09:53 AM
ですね〜〜〜〜
Avatar
lovee 07-Nov-17 09:54 AM
むしろなんでないんだろって思う
そっちの方がメモリ管理も楽そうなのにな
reserveCapacity とか考えなくて済む
Avatar
omochimetaru 07-Nov-17 09:56 AM
単に優先度っぽいですけどね、具体的なコアチームからの反論はみてない気がする
Avatar
koher 07-Nov-17 09:57 AM
Generics Manifesto にもないよね?当分( Swift 5, 6 あたりで)はなさそうな気が。
Avatar
omochimetaru 07-Nov-17 09:59 AM
あった!!
Currently, Swift's generic parameters are always types. One could imagine allowing generic parameters that are values, e.g.,
struct MultiArray<T, let Dimensions: Int> { // specify the number of dimensions to the array subscript (indices: Int...) -> T { get { require(indices.count == Dimensions) // ... } }
(edited)
例もまさに Vector<N> ですね。
MayBe セクションだから
ワンチャンあるで〜
Avatar
Avatar
omochimetaru 07-Nov-17 10:03 AM
てか、 Rust Like な Generic Protocol についても書いてあるな
対応見込みは Unlikly になっている
struct Real { ... } extension Real : ConstructibleFrom<Float> { init(_ value: Float) { ... } } extension Real : ConstructibleFrom<Double> { init(_ value: Double) { ... } }
サンプルも Rust の From trait と似てる
Avatar
lovee 07-Nov-17 10:05 AM
正直長すぎてどの項目がどの項目のサブ項目なのかわからないしOutline機能欲しい…
せめてFold機能欲しい
Avatar
omochimetaru 07-Nov-17 10:06 AM
たしかに。限界を感じます
Avatar
norio_nomura 07-Nov-17 12:08 PM
上で出て来たenumstateパターン、無理やりRawValueに振る舞いを実装して見た https://gist.github.com/norio-nomura/65db97c4786851bc368a8d68834fb31b (edited)
Avatar
lovee 07-Nov-17 01:32 PM
https://qiita.com/taketo1024/items/71e3272211f08d7e0cde 例のこのPhantom Typeのやつ、extensionで where T: Ready で書くと問題ないけど、where T == Ready で書くと Something.createInstance() の直後でも変換の補完で .shout() が出るのなんで?(もちろんコンパイルエラーにはなるけど…)
社内の「Scala 勉強会」で Phantom Type (幽霊型) という厨二心をくすぐる感じのデザインパターンを教えてもらったので、同じことを Swift でもやってみました。 インスタンスの状態を変数ではなく **型パ...
これのせいで微妙に辛いのはStatusがstructで作りにくい…
Avatar
hiragram 08-Nov-17 03:15 AM
@omochimetaru おもちのgysb、他のファイルにあるSwiftのメソッドとか呼べる?
Avatar
omochimetaru 08-Nov-17 03:16 AM
呼べません
呼びたい?
いまは変換して作られたswiftコードを $ swift generate.swift で実行しているだけなんや。
Avatar
hiragram 08-Nov-17 03:18 AM
僕が普段gyb使うケース、gybのテンプレートからpythonで書いたSwaggerのyamlのパーサーをimportして使ってるので、それができれば嬉しみって感じ
Avatar
omochimetaru 08-Nov-17 03:19 AM
そもそもswiftには隣においてあるファイルを読み込む機能とかないから
どうやるのがいいか悩むね。
Avatar
hiragram 08-Nov-17 03:19 AM
インタプリタ実行じゃ無理か
Avatar
omochimetaru 08-Nov-17 03:19 AM
gysb側で % include "./hoge.swift" みたいな機能を追加して
Avatar
hiragram 08-Nov-17 03:20 AM
無理やり展開する?
Avatar
omochimetaru 08-Nov-17 03:20 AM
テキストとしてそのままぶち込むのはどうか
古き良きプリプロセッサ
Avatar
hiragram 08-Nov-17 03:20 AM
なんとなく動きそうな感じはする
Avatar
omochimetaru 08-Nov-17 03:20 AM
issueにしとく いまちょっとパーサーを直さなきゃいけないことに気がついたからあとまわし
Avatar
hiragram 08-Nov-17 03:20 AM
🙆
わしもあとでgysbのコードちゃんとよむね
Avatar
omochimetaru 08-Nov-17 03:21 AM
いま最新コミット完全にぶっ壊れてるから一個前を見てw
Avatar
hiragram 08-Nov-17 03:21 AM
Avatar
omochimetaru 08-Nov-17 03:21 AM
ちょっと保存するのにうっかりmasterにやっちまった
Avatar
hiragram 08-Nov-17 03:21 AM
0.1.0のタグ打とう
Avatar
omochimetaru 08-Nov-17 03:21 AM
たしかに。
うった
Avatar
omochimetaru 08-Nov-17 03:59 AM
あれ、swift runが壊れた。
Avatar
omochimetaru 08-Nov-17 04:14 AM
0.2.0 できた。
%{ let intTypes = [8,16,32,64] }% % for intType in intTypes { % for sign in ["", "U"] { /// Extension that adds a few additional functionalities to ${sign}Int${intType} extension ${sign}Int${intType} { /// Returns a ${sign}Int${intType} with all ones % if sign == "" { public static var allOnes: Int${intType} { return Int${intType}(bitPattern: UInt${intType}.max) } % } else { public static var allOnes: UInt${intType} { return UInt${intType}.max } % } } % } % }
Avatar
koher 08-Nov-17 04:15 AM
すぐ API のミスに気づいたりするから、とりあえず -alpha とか -beta つけるのオススメ。
Avatar
omochimetaru 08-Nov-17 04:16 AM
↑これ綺麗に出力できる モアイさんの例↓ http://moapp.hateblo.jp/entry/2017/06/30/210636
Swift gybの環境構築 ふとSwiftのgybが気になったので環境構築を試して見ました gybとは Swift言語開発の副産物のメタプログラミングツールgybがとても良い— おもちメタル (@omochimetaru) 2017年6月30日 gybは「Generate Your Boilerplate」の略称みたいです(gyb --helpより) 具体的に何かと言うと、Swiftの公式リポジトリの中でSwiftコードの自動生成に使われているPython製のテンプレートエンジンになります gybを導入する qiita.com というわけで、こちらを参考に環境構築して見ました まずgyb自体…
ふむう > alpha
Avatar
Biacco42 08-Nov-17 04:17 AM
gyb よく知らないけれどマクロ的なやつなのか
Avatar
hiragram 08-Nov-17 04:17 AM
テンプレートエンジン?
Avatar
omochimetaru 08-Nov-17 04:17 AM
↑のモアイさんの記事読むと良いよ
func readToken() -> Optional<Token> を func readToken() -> Token に変えて、 enum Token に case end を足したらすごく良くなった https://github.com/omochi/gysb/blob/master/Sources/gysb/Token.swift#L18
gysb - Generate your swifty boilerplate
Avatar
Biacco42 08-Nov-17 04:19 AM
よんだ
なるほど
Avatar
omochimetaru 08-Nov-17 04:20 AM
とても良いツールなんだけど
pythonを書かされるという致命的な問題点があるので
それを解決したのが拙作のgysbですw
Avatar
Biacco42 08-Nov-17 04:39 AM
なるほどアツい
Avatar
koher 08-Nov-17 05:25 AM
ただ、 Python なのも良いところがあって、 Swift のコードの合間に書かれているときはぱっと見で Python の方が区別しやすいかも?
Avatar
hiragram 08-Nov-17 05:26 AM
脳のスイッチングコストは結構でかいです
Avatar
omochimetaru 08-Nov-17 05:26 AM
まあ僕はガチャガチャ複数言語書くの慣れてるけど
ひらりとかそもそもパイソン書いたことなかったよね。
Avatar
hiragram 08-Nov-17 05:27 AM
うん
gybのために嫌々始めた
Avatar
omochimetaru 08-Nov-17 05:27 AM
Avatar
koher 08-Nov-17 05:28 AM
確かに Python を知らない人にとってはハードルが高いな。
しかも end とか Python じゃないし。
Avatar
hiragram 08-Nov-17 05:29 AM
イニシャライザちゃんと書かないとプロパティがあったりなかったりするのすごくキツイんだけど何か間違ってるのかもしれない
Avatar
omochimetaru 08-Nov-17 05:31 AM
pythonになってるメリットはwindowsとかでも動くことだと思います
Avatar
koher 08-Nov-17 05:32 AM
まあ、 Swift が動かない環境で Swift で書くツールを使おうとしないでしょう・・・。
Avatar
omochimetaru 08-Nov-17 05:33 AM
swiftコンパイラ本体の開発は まだ動いてない環境でswiftを動かすタスクだから
swiftに依存しないでswiftを作らないといけないけど
たしかに、コンパイラじゃなくてswiftアプリケーションを作る場面なら
swiftに依存してても問題ないですねw
Avatar
koher 08-Nov-17 05:34 AM
コンパイラ開発であっても、プログラミング言語はある程度固まってきたらセルフホスティングになることも多いし、 gyb レベルならもう Swift でいい気がする。 (edited)
Avatar
omochimetaru 08-Nov-17 05:42 AM
セルフホスティングになった言語って
まだコンパイラをビルドしてない新しい環境に対応するときはどうすんだろ
昔のC++の実装で、古いバージョンをコンパイルしてから、 その古いバージョンを使って最新のバージョンをセルフコンパイルする?
Avatar
tarunon 08-Nov-17 05:43 AM
一回でいけるのかな
Avatar
Avatar
yutailang0119 09-Nov-17 01:17 AM
セルフホスティングになると何がメリットなんだろう、コンパイラもSwiftで書かれてるからメンテしやすいとか? Goがセルフホスティングになった時に、話題にはなっていたけど、いまいち理解できてない
Avatar
omochimetaru 09-Nov-17 02:13 AM
その言語が、コンパイラを書くのに向いてるのであれば、コンパイラの保守性が上がると思います でも半分はロマンな気がする・・・
Avatar
Kishikawa Katsumi 09-Nov-17 02:25 AM
ロマン いつかはセルフホスティングみたいなのはある気がする。
Avatar
koher 09-Nov-17 02:43 AM
この言語自身で効率的にコンパイラを書け、そのコンパイラのパフォーマンスも良いのであれば、その言語のその分野での有効性を示せるとは思います。
「その分野での」と書きましたが、コンパイラのコードは複雑なのでそれがキレイに書けるのは言語の記述能力の高さを示せそうだし、コンパイラにはパフォーマンスも求められるので、ローレベルからハイレベルまで幅広い範囲で有効性を示そうな気がします。そして、 Swift はまさにそれに向いている言語だと思うので、どこかの段階でセルフホスティングになってほしいですねぇ。まだ時期尚早だとは思いますが。
👀 1
Avatar
omochimetaru 09-Nov-17 02:51 AM
Swiftコンパイラのアーキテクチャでいうと LLVM をライブラリとしてガシガシに使っているから
C++ Interop が実現されるか、もしくは、
LLVMをSwift化するか・・・
Avatar
rintaro 09-Nov-17 03:09 AM
https://github.com/trill-lang/LLVMSwift 完全ではないけど、LLVM ラッパ的なプロジェクトはありまっせ。 (edited)
LLVMSwift - A Swift wrapper for the LLVM C API (version 5.0)
Avatar
omochimetaru 09-Nov-17 03:10 AM
マジか
Authors Harlan Haskins (@harlanhaskins) Robert Widmann (@CodaFi)
コダフィ氏だ
Avatar
koher 09-Nov-17 03:11 AM
ちゃんと SwiftPM 準拠だ。
Avatar
norio_nomura 09-Nov-17 04:01 AM
Swift 4.0.2に-swift-version 3を渡してるかどうかは #if swift(>=3.2.2) で判定。 (edited)
Avatar
yutailang0119 09-Nov-17 05:37 AM
なるほどw > ロマン
Avatar
rintaro 09-Nov-17 07:29 AM
https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20171106/041072.html
FWIW, I’m getting optimistic about moving to a forum soon.
Ted から久々にフォーラム移行についての言及。まだまだ曖昧。
Avatar
omochimetaru 09-Nov-17 07:29 AM
早くしてほしい・・・ ログが調べにくいせいからか話題がループしてるのを感じる
@hiragram include実装したよ
Avatar
hiragram 09-Nov-17 07:35 AM
おっ
@omochimetaru SwiftってJSONは読めるけどYAMLは読めないよね確か
Avatar
omochimetaru 09-Nov-17 07:35 AM
なんのこっちゃ
FoundationにYAMLのなんかがあるかってこと?
Avatar
hiragram 09-Nov-17 07:36 AM
わしのgybのユースケースでgysbに置き換えるならgysbファイルからincludeした先でSwaggerのymlをパースする必要がある
Avatar
omochimetaru 09-Nov-17 07:38 AM
ンゴ・・・
yamlのライブラリをソースとして隣においておいて
元のジェネレータで全部includeする形で対応になる
Avatar
hiragram 09-Nov-17 07:40 AM
なるほろ
まあSwaggerのymlをjsonに変換しちゃうのもあり
Avatar
omochimetaru 09-Nov-17 07:40 AM
それだったらincludeいらないやんけ
Avatar
hiragram 09-Nov-17 07:40 AM
いやいるよ
Avatar
omochimetaru 09-Nov-17 07:41 AM
なんでだっけ
Avatar
hiragram 09-Nov-17 07:41 AM
jsonをdictionaryにしたとしてそれをそのままテンプレート側で値取ってくるのしんどいでしょ
Avatar
omochimetaru 09-Nov-17 07:41 AM
ああ、jsonを取り回すユーティリティがほしいのか。
Avatar
hiragram 09-Nov-17 07:41 AM
そう
Avatar
omochimetaru 09-Nov-17 07:41 AM
理解
Avatar
omochimetaru 09-Nov-17 09:04 AM
@hiragram
Avatar
hiragram 09-Nov-17 09:04 AM
はーい
Avatar
omochimetaru 09-Nov-17 09:04 AM
gysb - Generate your swifty boilerplate
[omochi@omochi-iMac gysb (master *+=)]$ cat Examples/include.swift.gysb %! include_code("libs/*.swift") % aaa=${aaa()} bbb=${bbb()} [omochi@omochi-iMac gysb (master *+=)]$ swift run gysb Examples/include.swift.gysb aaa=999 bbb=777
Avatar
hiragram 09-Nov-17 09:04 AM
%!
メタofメタ
Avatar
omochimetaru 09-Nov-17 09:05 AM
%! と include_code を追加したのでなんとかなる
Avatar
hiragram 09-Nov-17 09:05 AM
良い
Avatar
omochimetaru 09-Nov-17 09:05 AM
ワイルドカード対応したから
Avatar
hiragram 09-Nov-17 09:05 AM
おおっ
Avatar
omochimetaru 09-Nov-17 09:05 AM
あとは試してみて
Avatar
hiragram 09-Nov-17 09:05 AM
master *+= ってなんや💢て思ったけどプロンプトだった
Avatar
omochimetaru 09-Nov-17 09:06 AM
ほんとだw
汚いスクショになってしまった。
Avatar
norio_nomura 09-Nov-17 09:06 AM
ああ、libYAMLを使ってるYamsは使えなさげ。
Avatar
omochimetaru 09-Nov-17 09:06 AM
swiftソースをテキスト展開してるだけなので
リンクが必要だとダメですね・・・
%! swift_package("Package.swift") とか定義しておくと SPM の executable として実行するような機能を作ったら対応できそう。
Avatar
tarunon 09-Nov-17 09:08 AM
%{...}の中にimportは書けないのか
Avatar
koher 09-Nov-17 09:08 AM
どんどん大掛かりになってる・・・
Avatar
omochimetaru 09-Nov-17 09:10 AM
%{...}の中にimportは書けないのか
Swiftのimportは書けるよ。
import Foundation とかはできる。
swift コマンドで何もしないでも import できるものはimportできるってこと
[omochi@omochi-iMac gysb (master=)]$ swift run gysb --compile Examples/include.swift.gysb func write(_ s: String) { print(s, terminator: "") } func aaa() -> Int { return 999 } func bbb() -> Int { return 777 } write("aaa=") write(String(describing: aaa())) write("\n") write("bbb=") write(String(describing: bbb())) write("\n")
swiftc みたいに、途中の段階で実行を止める機能を作ったので
たのしいです
--parse , --macro , --compile , --render と4ステージあります
swift コマンドの -Xlinker だけ指定できれば libYAML はいけるかな・・・?
Avatar
norio_nomura 09-Nov-17 09:14 AM
gysbがライブラリになっていて、.gysbインプットから.swiftStringを作れるAPIがあると、swift testの度に.swiftを生成する事ができる様になります。 (edited)
Avatar
omochimetaru 09-Nov-17 09:14 AM
MSVCがソースファイルのなかに #comment(lib, "GL.h") ってかいてリンク指定できるみたいな。 (edited)
Avatar
norio_nomura 09-Nov-17 09:15 AM
Yamsは*.cをパッケージ内に持ってて、SwiftPMにClangモジュールとしてビルドしてもらってます。
Avatar
omochimetaru 09-Nov-17 09:16 AM
いまここが、コンパイラのstdout / stderr を、そのまま垂れ流しにしちゃっているので
ここをキャプチャしてやれば
.gysbインプットから.swiftのStringを作れるAPI
もいけそうです
あー、Cソースも持っているのか。それはもうSPMとして全体を実行する以外無理そうだなあ
ひらりの要望だけで無限にシステムが複雑になったw
Avatar
norio_nomura 09-Nov-17 09:18 AM
w
Avatar
hiragram 09-Nov-17 09:18 AM
いいぞいいぞ〜❗
Avatar
omochimetaru 09-Nov-17 09:18 AM
効率悪いのが、一個のテンプレートの処理のたびに spm package つくることになっちゃって
依存ライブラリを取り直しまくることになるんだよなあ
いまは トップレベルで printするSwiftソースとしてコンパイルしているけど
ひとつのファイルの処理結果を得る関数をもったSwiftソースとしてコンパイルして
入力のテンプレートファイル全部を関数としてまとめて一個のバイナリにした上で
それぞれ出力する、みたいな形にすると、それ系をまとめられるが・・・・
Avatar
norio_nomura 09-Nov-17 09:22 AM
Xcodeで使う分にはRun Script Phaseを使えるからCLIでいいけど、SwiftPMはビルドプロセスに入れられないのがネックだね。
Avatar
omochimetaru 09-Nov-17 09:23 AM
あ、そもそも、 gysb を SwiftPM のビルドに差し込めない問題の話ですか。
そこはもう gysb と 変換先の swift を両方コミットしてもらうしかないっすねえ・・・
Avatar
hiragram 09-Nov-17 09:24 AM
🙃
まあそれは今のgyb使ってるやり方でも同じことで(Vapor Cloudにデプロイするのに vapor build の手前に処理を差し込む方法ないのって問い合わせたらねえって言われた (edited)
Avatar
omochimetaru 09-Nov-17 09:27 AM
vapor build ってコマンドで全てを発火するの?
Avatar
hiragram 09-Nov-17 09:27 AM
ん?
vapor cloud deploy するとリモートでチェックアウトして vapor build が動くんだけどその手前でコードジェネレータ動かしてもらわないと成果物コミットしてないから当然コンパイル通らない
Avatar
omochimetaru 09-Nov-17 09:28 AM
んーっと vapor build は 内部で swift build をする、みたいな感じかなと
Avatar
hiragram 09-Nov-17 09:28 AM
そう
Avatar
omochimetaru 09-Nov-17 09:28 AM
あー リモートでデプロイするためのコマンドが手前側にあって
リモートはvapor build をするのか
Avatar
hiragram 09-Nov-17 09:28 AM
そうそう
Avatar
omochimetaru 09-Nov-17 09:28 AM
うわ〜 それだと何もさせないね
せめてローカルのvapor build ならオレオレbuildを叩くようにすれば手前にはさめたけど
向こう側はどうしようもなさ
Avatar
hiragram 09-Nov-17 09:29 AM
コミットするしかないんやろかとなって一旦デプロイ周りは棚上げしといた
Avatar
omochimetaru 09-Nov-17 09:29 AM
でもそれだと、CSS Spriteとか
Avatar
hiragram 09-Nov-17 09:29 AM
VaporのSlackで聞いたら「今は無いけど将来やりたいねそれ」って言ってた
Avatar
omochimetaru 09-Nov-17 09:29 AM
なんか他にもいろんな前処理したいときにできなくね?
あ、そういうのはコンパイル後だからなんとかなるのかな?
Avatar
hiragram 09-Nov-17 09:30 AM
そもVaporアプリ自体のコンパイルに必要でなければあとでも良い気がする。
Avatar
omochimetaru 09-Nov-17 09:30 AM
リソースはvapor buildとは別に用意したらいいのか。
Avatar
hiragram 09-Nov-17 09:30 AM
そね
Avatar
omochimetaru 09-Nov-17 10:53 AM
テストできるようになりました。
👍 1
🎊 1
Avatar
norio_nomura 09-Nov-17 11:05 AM
環境変数を使ってPackage.swiftの内容を切り替え、GYSB=1 swift testでコード生成し、swift testで生成したコードを利用する方法を思いついた。
Avatar
omochimetaru 09-Nov-17 11:11 AM
あー たしかにテスト実行中にソースを書き出せば、、、
Avatar
norio_nomura 09-Nov-17 11:11 AM
テストターゲットを生成用と利用用に分ける方法も考えたけど、swift test --filter Generateとテストするモジュールを制限しても全てをビルドしようとするから、未生成なコードに依存する部分がビルド出来なくてダメだった。
Avatar
omochimetaru 09-Nov-17 11:12 AM
そうか、テストターゲットじゃないと、実行ができないのか
Avatar
norio_nomura 09-Nov-17 11:18 AM
// swift-tools-version:4.0 import PackageDescription import Foundation let package: Package if ProcessInfo.processInfo.environment["GYSB"] != nil { package = Package( name: "Generate", dependencies: [ .package(url: "https://github.com/omochi/gysb.git", .branch("master")), ], targets: [ .testTarget(name: "Generate", dependencies: ["GysbKit"], path: "Tests/GenerateTests") ] ) } else { package = Package( name: "Example", products: [ .library(name: "Example", targets: ["Example"]), .library(name: "Generated", targets: ["Generated"]), ], targets: [ .target(name: "Example", dependencies: ["Generated"]), .target(name: "Generated", dependencies: []), .testTarget(name: "ExampleTests", dependencies: ["Example"]), ] ) }
$ tree . ├── Package.resolved ├── Package.swift ├── README.md ├── Sources │   ├── Example │   │   └── BuildPhase.swift │   └── Generated │   └── vector.swift └── Tests ├── ExampleTests │   └── ExampleTests.swift ├── GenerateTests │   └── GenerateVectorTests.swift └── LinuxMain.swift
こんな感じ
(edited)
あ、テンプレートを別の場所に置かないとダメだ。
Avatar
norio_nomura 09-Nov-17 01:31 PM
Package.swiftYamsをビルドして、それを.gysbの中でインポートしようとしてるのだけど、うまくいかないな。
Test Case '-[GysbWithYamsTests.GysbWithYamsTests testExample]' started. process execution failure path=[/usr/bin/swift] arg[0]=[/var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift] arg[1]=[-L] arg[2]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] statusCode=[1] stderr= /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift:4:9: error: no such module 'Yams' import Yams ^ Test Case '-[GysbWithYamsTests.GysbWithYamsTests testExample]' passed (0.438 seconds).
Avatar
omochimetaru 09-Nov-17 01:32 PM
$ /usr/bin/swift /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift
↑これを実行しているだけだから、フレームワークサーチパス的なところで
ビルド済みのYamsが見えていないと
見つけられないです
Avatar
norio_nomura 09-Nov-17 01:33 PM
とりあえずこんな感じで起動してます。
return try execCapture(path: swiftPath, arguments: [path, "-L", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug"])
(edited)
Avatar
omochimetaru 09-Nov-17 01:34 PM
ああなるほど。
ほんとだ、よくみてなかった。
とりあえず、直接swiftコマンドで実行できるコマンドを
見つけるのが良さそう
-F <value> Add directory to framework search path
.frameworkならこっちですよ。
static libarryなら、 -L <value> Add directory to library link search path -l<value> Specifies a library which should be linked against これらの併用がひつよう
フレームワークの場合に -l も必要だったかはよくわからない
Avatar
norio_nomura 09-Nov-17 01:45 PM
-I…,-L…,-F…つけても、YamsのPackage.swiftでライブラリtypeを.static.dynamicにして-lYamsつけてもダメだ。
path=[/usr/bin/swift] arg[0]=[/var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_NwwoI7hu.swift] arg[1]=[-I] arg[2]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[3]=[-F] arg[4]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[5]=[-L] arg[6]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[7]=[-lYams] statusCode=[1] stderr= /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_NwwoI7hu.swift:4:9: error: no such module 'Yams' import Yams
(edited)
Avatar
omochimetaru 09-Nov-17 01:46 PM
うへえ
Avatar
norio_nomura 09-Nov-17 01:47 PM
ああ、ソースコードのパスを引数の最後に持ってきたら通った。
Avatar
omochimetaru 09-Nov-17 01:48 PM
おお。
Avatar
norio_nomura 09-Nov-17 01:59 PM
Yamsのlibrary typeを.dynamicにして、以下のオプションをswiftに渡したらいけた。
return try execCapture(path: swiftPath, arguments: [ "-I", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug", "-L", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug", "-lYams", path, ])
Avatar
omochimetaru 09-Nov-17 01:59 PM
-I と -L は両方そこでいいんですね
Avatar
norio_nomura 09-Nov-17 02:00 PM
テンプレートはこんな感じ
% import Foundation % import Yams % guard let yaml = try Yams.compose(yaml: String(contentsOf: URL(fileURLWithPath: "TestResources/vector/vector.yml"))) else { fatalError() } % let vars = yaml.array().flatMap { $0.string } % for n in 2...4 { struct Vector${n} { % for i in 0..<n { var ${vars[i]}: Float % } } % }
Avatar
omochimetaru 09-Nov-17 02:00 PM
これは、アプリのプロジェクトのPackage.swiftで、Yamsとgysbの両方を依存させていて、 swift run gysb が通る状態?
Avatar
norio_nomura 09-Nov-17 02:01 PM
// swift-tools-version:4.0 import PackageDescription let package = Package( name: "GysbWithYams", dependencies: [ .package(url: "https://github.com/omochi/gysb.git", .branch("master")), .package(url: "https://github.com/jpsim/Yams.git", .branch("master")), ], targets: [ .testTarget( name: "GysbWithYamsTests", dependencies: ["GysbKit", "Yams"]), ] )
class GysbWithYamsTests: XCTestCase { func testExample() { do { let driver = Driver.init(path: "TestResources/vector/vector.swift.gyb") let actual = try driver.render(to: .render) print(actual) } catch { print(error) } } static var allTests = [ ("testExample", testExample), ] }
(edited)
Avatar
omochimetaru 09-Nov-17 02:02 PM
なるほど
Avatar
norio_nomura 09-Nov-17 02:07 PM
SwiftPMはライブラリプロダクトのtypeが未指定でもリンクしてくれますが、この使い方の場合、libYams.alibYams.dylibが無いとダメですね。
type: .staticでも本当はいけると思うのですが、swiftcがクラッシュしてしまいダメでしたが。
Avatar
omochimetaru 09-Nov-17 02:08 PM
なるほど〜
SwiftPMのデフォルトは .static なんですか?
Avatar
norio_nomura 09-Nov-17 02:10 PM
Swift 4からデフォルトではライブラリを生成しなくなりました。
Avatar
omochimetaru 09-Nov-17 02:10 PM
ほう
Avatar
norio_nomura 09-Nov-17 02:10 PM
ライブラリを構成する.o達を直接リンクします。 (edited)
Avatar
omochimetaru 09-Nov-17 02:10 PM
マジか
あーシンボルはパッケージで切ってるからいいじゃんってか
Cとはちょっと違う世界に進みつつありますね
Avatar
norio_nomura 09-Nov-17 02:11 PM
swift test -vとかしてみるとコンパイラの起動オプションを見られます。
type: .dynamicにするとswift build --static-swift-stdlibとかしてもそれらのライブラリはダイナミックリンクされるみたいだから、今後は使い勝手が悪くなると避けられるんじゃないかな? (edited)
Avatar
omochimetaru 09-Nov-17 02:18 PM
うーむ、そうなんですかね Swiftが出てきたころから基本dynamic frameworkとembeddedだったから (edited)
てっきりそういう思想なのかと思っていたけど
最近static系のサポートも強くなってきていますね
Avatar
norio_nomura 09-Nov-17 02:37 PM
.dynamicなライブラリを同じパッケージ内のexecutableターゲットから使う場合は問題ないのですが、依存しているパッケージから使った場合、それらはフルパスでリンクされてしまい、ポータブルなexecutableではなくなってしまいます。
$ otool -L ./.build/x86_64-apple-macosx10.10/debug/gysbClient ./.build/x86_64-apple-macosx10.10/debug/gysbClient: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1445.12.0) /Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug/libGysbKit.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
(edited)
Avatar
omochimetaru 09-Nov-17 02:38 PM
ふむ
Avatar
koher 09-Nov-17 02:55 PM
前も書いたけど、 gyb でなくても Swift で Multiline String Literal が追加されたから、↓みたいな感じで大体いける気がする。これならなんでもフルに Swift の機能使える。
prefix operator > prefix func >(value: String) { print(value) } let intTypes = [8, 16, 32, 64] for intType in intTypes { for sign in ["", "U"] { >""" /// Extension that adds a few additional functionalities to \(sign)Int\(intType) extension \(sign)Int\(intType) { /// Returns a \(sign)Int\(intType) with all ones """ if sign == "" { >""" public static var allOnes:Int\(intType) { return Int\(intType)(bitPattern: UInt\(intType).max) } """ } else { >""" public static var allOnes:UInt\(intType) { return UInt\(intType).max } """ } >""" } """ } }
(edited)
元の gyb は↓。
%{ intTypes = [8,16,32,64] }% % for intType in intTypes: % for sign in ['','U']: /// Extension that adds a few additional functionalities to ${sign}Int${intType} extension ${sign}Int${intType} { /// Returns a ${sign}Int${intType} with all ones %if sign == '': public static var allOnes:Int${intType} { return Int${intType}(bitPattern: UInt${intType}.max) } %else: public static var allOnes:UInt${intType} { return UInt${intType}.max } %end } %end %end
Avatar
norio_nomura 09-Nov-17 11:24 PM
gysb - Generate your swifty boilerplate
😎 1
Avatar
omochimetaru 10-Nov-17 05:52 AM
SwiftPM対応できた
%! swift_config("gysb_swift_config.json") %{ import Foundation import Yams let yamlPath = URL.init(fileURLWithPath: "data.yml") let yamlStr = try! String(contentsOf: yamlPath, encoding: .utf8) let yaml = try Yams.compose(yaml: yamlStr)! let fields: [String] = yaml.array().map { $0.string! } }% struct Data { % for field in fields { var ${field}: String % } }
json
{ "packageDependencies": [ { "url": "https://github.com/jpsim/Yams.git", "requirement": { "identifier": "0.5.0", "type": "exact" } }, ], "targetDependencies": [ { "name": "Yams" } ] }
Avatar
norio_nomura 10-Nov-17 05:54 AM
おお、すげー!
Avatar
omochimetaru 10-Nov-17 05:55 AM
実行時に複数ファイル指定した場合は、一つのSwiftPMターゲットにまとめるから、Yamsの取得やビルドは共有される ただし、 %! swift_config() の指定は1ファイルだけがする。
Avatar
koher 10-Nov-17 05:55 AM
@omochimetaru 使う側はどこで Package.swift 指定するの?コマンドオプション?
Avatar
omochimetaru 10-Nov-17 05:55 AM
↑にはったjsonを書く。
Avatar
koher 10-Nov-17 05:56 AM
ああ、↓に書くのか。
%! swift_config("gysb_swift_config.json")
Avatar
norio_nomura 10-Nov-17 05:58 AM
昨日僕が無理やりswiftのコマンドラインオプションでやってたことを、全部SwiftPMへ丸投げしたということですね。 👍
Avatar
omochimetaru 10-Nov-17 05:59 AM
ですね SPMのワークスペースを作って、execターゲットのmain.swiftを生成するようになりました
Avatar
koher 10-Nov-17 06:00 AM
@omochimetaru Package.swift 的に、 gybs.json をディレクトリにおいておけば自動的に反映とかが良くないかな?そうすれば gysb ファイルに余計なものを追加しなくて良くて、gyb を Swift にしただけという体を保てそう。 (edited)
ただし、 %! swift_config() の指定は1ファイルだけがする。
これも結構罠になりそう。
a と b で同じライブラリが必要だけど、 a だけ、 b だけ、 a と b 同時に、って gysb に渡すときに全部サポートすることができなさそう🤔
Avatar
omochimetaru 10-Nov-17 06:04 AM
ディレクトリにおいておくっていうのが悩ましくて source/fooModule/foo.swift.gysb source/barModule/bar.swift.gysb ってなってるときに $ gysb source/fooModule/foo.swift.gysb って指定すると、 gysb.json はどこにあるんだ?ってなっちゃうんですよね
Avatar
koher 10-Nov-17 06:04 AM
source/fooModule/gybs.json じゃないかなぁ
それか、Package.swift と同じ階層におくことにするか。
Avatar
omochimetaru 10-Nov-17 06:05 AM
それは場合によっていて、 source/ ** / * .gysb をドカンとツリー変換したい場合もあるだろうから
Avatar
norio_nomura 10-Nov-17 06:05 AM
%! import("https://github.com/jpsim/Yams.git")
とかするとswift_config()に渡すjson相当のものが自動で生成される様にするとか。
Avatar
omochimetaru 10-Nov-17 06:06 AM
$ gysb --config source/gysb.json source/fooModule/foo.swift.gysb こういう感じはできるけどコマンドラインを長くしたくない・・・
Avatar
koher 10-Nov-17 06:06 AM
↑それだとファイルとライブラリの関係を示せない
Avatar
omochimetaru 10-Nov-17 06:06 AM
これも結構罠になりそう。 a と b で同じライブラリが必要だけど、 a だけ、 b だけ、 a と b 同時に、って > gysb に渡すときに全部サポートすることができなさそう
configが同じファイルならOKにするか
Avatar
koher 10-Nov-17 06:06 AM
利用側がどの gysb.json を使えばいいかわからないから
Avatar
omochimetaru 10-Nov-17 06:07 AM
同じconfigになっているソースがまとめて指定される限りOK
これだとソースが自己言及的にできる
Avatar
koher 10-Nov-17 06:07 AM
対象となる gysb ファイルから遡って、 Package.swift と同じ階層までの gysb.json を適用するとかどう? (edited)
ああ
そうか
別に Swift 限定じゃないから
Avatar
omochimetaru 10-Nov-17 06:08 AM
%! import("https://github.com/jpsim/Yams.git") とかするとswift_config()に渡すjson相当のものが自動で生成される様にするとか。
これの問題点は、パッケージ名からターゲット名がわからないこと
そう、あと、生成テンプレートはSwiftに依存させたくないから
Package.swiftを探すとかは マッチしない場合も多そう
Avatar
norio_nomura 10-Nov-17 06:09 AM
なるほど。
Avatar
koher 10-Nov-17 06:09 AM
gyb って import 使えるんだっけ?
使えるなら参考にできるかも?
Avatar
hiragram 10-Nov-17 06:09 AM
つかえます
Avatar
omochimetaru 10-Nov-17 06:09 AM
gybは使えますね、pythonの言語機能のimportが使える。
Avatar
koher 10-Nov-17 06:09 AM
たとえば、パスの通ってるところに
Avatar
omochimetaru 10-Nov-17 06:09 AM
Swiftのimportはファイルパス的なしくみじゃないからできない。
Avatar
koher 10-Nov-17 06:09 AM
Foo.framework を置いてある前提にするとか?
あー,
Swift PM に乗っかって実行してるんだっけ?
Avatar
omochimetaru 10-Nov-17 06:10 AM
そうそう。
Avatar
koher 10-Nov-17 06:10 AM
それなら無理か。
お、じゃあ
Avatar
norio_nomura 10-Nov-17 06:10 AM
libSwiftPMが気軽に使えれば「リポジトリからPackage.swiftを解釈して〜」とか簡単に出来そうなのに… https://github.com/apple/swift-package-manager/blob/master/Package.swift#L19
swift-package-manager - The Package Manager for the Swift Programming Language
Avatar
koher 10-Nov-17 06:11 AM
gysb を実行したディレクトリが対象となるファイルの先祖ディレクトリの場合、
対象ファイルのディレクトリからカレントディレクトリまで遡って探すとかは?
Avatar
norio_nomura 10-Nov-17 06:12 AM
SwiftPMにgysb機能を載せた方が早そうな気がしてきた。
Avatar
koher 10-Nov-17 06:12 AM
そうすれば SwiftPM 対応のリポジトリで、リポジトリのルートに gysb.json おいて一括実行とかもできる
Avatar
omochimetaru 10-Nov-17 06:13 AM
現状の仕様で、テンプレート側から
gysb.json を指定していれば
それでスッキリしてません?
探索するとかは、Swift以外の利用時に無駄な処理になるし
カレントディレクトリの影響をうけずにコマンドラインだけで一貫した結果がいい
Avatar
koher 10-Nov-17 06:14 AM
@omochimetaru これを swift リポジトリ本体に組み込むことを目指すなら、できるだけ gyb に寄せておいた方が受け入れられる気がして、余計なものを付けない方がいいかなぁと。
↓この記法一つで議論の余地がいくらでもあると思うので。
%! swift_config("gysb_swift_config.json")
Avatar
omochimetaru 10-Nov-17 06:14 AM
Swift本体に組み込む事は目指してなかったですね、Swiftソース以外の生成も前提にしているから、そこで設計方針がかみあわないのか
個人的にはC++の生成にも使いたいのです
Avatar
tarunon 10-Nov-17 06:15 AM
Swiftのコンパイル時にSwiftが必要になるから、gybの代替にはなれない気がする
Avatar
koher 10-Nov-17 06:16 AM
セルフホスティングはまだ早いと思いますが、gyb 程度の用途だったらいけそうな気も。
Avatar
hiragram 10-Nov-17 06:16 AM
Swift本体とは独立したテンプレートエンジンとして存在してもらうほうが使う側としては嬉しみ
Avatar
omochimetaru 10-Nov-17 06:16 AM
↓この記法一つで議論の余地がいくらでもあると思うので。
そうですねえ、ここにマイクロ言語が必要になっているのは微妙ではある
Avatar
koher 10-Nov-17 06:16 AM
独立して使えるけど、それを swift リポジトリでも使うという状況を想定してます。
Avatar
norio_nomura 10-Nov-17 06:16 AM
brew install gysbできる様になると良いね。
Avatar
omochimetaru 10-Nov-17 06:16 AM
いま %! swift_config 以外に %! include_code っていうマクロ命令もあって
Avatar
koher 10-Nov-17 06:16 AM
それはしたい < brew
Avatar
omochimetaru 10-Nov-17 06:17 AM
それで他のSwiftソース(テンプレートロジックの方)を取り込んだりできるんですが
この機能のためにどうしてもミニ言語が必要に。
Avatar
koher 10-Nov-17 06:18 AM
include_code はカオス度が増しそうだなぁ。
Avatar
omochimetaru 10-Nov-17 06:18 AM
↑例
"libs/*.swift" に書いてある func aaa() {} と func bbb() {} がここにテキスト展開される。
Avatar
koher 10-Nov-17 06:19 AM
色々な機能を入れると混沌とするから、必要最小限なものをシンプルに保つのが良さそうな。サードパーティライブラリが使いたいのはわかるから、そこはなんとかするとして。
Avatar
omochimetaru 10-Nov-17 06:20 AM
Swiftがスクリプティングサポートを充実して
ソースコードの相対パスimportができれば
こんなものはいらなかったんだ
Avatar
koher 10-Nov-17 06:20 AM
gysb の実行を Swift PM に依存しない方法はないかな?
Avatar
omochimetaru 10-Nov-17 06:21 AM
さっきのYamsの例(Swift製YAMLライブラリ)だけみても
かなりきついですね
Cソースとかも絡んでいるので。
Avatar
koher 10-Nov-17 06:21 AM
swift コマンドで Framework のパス指定して実行できなかったっけ?
ライブラリのビルドは Swift PM でやるとして
Avatar
norio_nomura 10-Nov-17 06:21 AM
その辺り、昨夜僕が試しました。
Avatar
koher 10-Nov-17 06:21 AM
gysb が生成したコードの実行を Swift PM に依存しない
Avatar
omochimetaru 10-Nov-17 06:22 AM
Frameworkがdynamicかstaticかで渡し方が変わったり
Avatar
norio_nomura 10-Nov-17 06:22 AM
結論としては、ライブラリの配布元でのPackage.swiftによりswiftコマンドラインオプションの指定方法とか変わってくるので、めんどい。
Avatar
omochimetaru 10-Nov-17 06:23 AM
あと、>ライブラリのビルドは Swift PM でやるとして SPMの.buildから生成物を手で取ってくるっていうのは不便だと思います
Avatar
koher 10-Nov-17 06:23 AM
うーん、それならやっぱり gysb.json を gysb ファイルと同じ階層においておくだけってのはわかりやすいと思うけどなぁ。
一括実行は諦めるか、 SwiftPM 対応リポジトリの場合だけ Package.swift と同じ階層も見るとか。
あとはコマンドラインオプションで指定もできるくらいかなぁ。
Avatar
omochimetaru 10-Nov-17 06:25 AM
一括実行を諦めると
Yamsなどの重い依存を
何回も取得・ビルドすることになって
かなり動作が遅くなってしまう
Avatar
koher 10-Nov-17 06:26 AM
えっと、それは swift_config 書く場合と同じで
gysb.json は各ディレクトリに置くけど
一度に実行した場合はビルドは一度とかでいいんじゃない?
指定を gysb ファイルの中に書くか json ファイルの有無でやるかだけの違い。
gysb Sources/Foo/*.gysb Sources/Bar/*.gysb
Avatar
omochimetaru 10-Nov-17 06:27 AM
たとえば src/foo/a.swift.gysb src/foo/b.swift.gysb src/foo/gysb.json src/bar/c.swift.gysb src/bar/d.swift.gysb src/bar/gysb.json こうなってるときに $ gysb src/ こう実行したら
ああ、これは衝突するから一緒にはできませんよって
今と同じルールにするということか
Avatar
koher 10-Nov-17 06:28 AM
うん。解決ルールは今と変わらないはず。
Avatar
omochimetaru 10-Nov-17 06:28 AM
src/fooとsrc/barをまとめて変換したければsrc/gysb.jsonをおくと
Avatar
koher 10-Nov-17 06:29 AM
設定が同じ場合、 gysb をすべてのディレクトリにコピーしてまわるか、すべてのファイルの先頭の行に書くか程度の違い。
gysb src/ で再帰的にgysb さがすの??
Avatar
omochimetaru 10-Nov-17 06:29 AM
はい それはまだ対応してないけどやるつもり
Avatar
koher 10-Nov-17 06:30 AM
再帰は gysb -r src/ とか明示的にした方が良さそうな気も。
Avatar
omochimetaru 10-Nov-17 06:30 AM
ああ、そうですね。
$ gysb --source-dir src
こういうイメージ
Avatar
koher 10-Nov-17 06:30 AM
再帰指定のときはその過程の gysb.josn も全部適用で良さそう。 (edited)
Avatar
omochimetaru 10-Nov-17 06:31 AM
あ〜
gysb.jsonごとに実行を分割すればいいのか
ていうかそれファイル複数のときでも一緒だな
入力されたファイルごとに対応するgysb.jsonがあって、gysb.jsonごとにグルーピングしてそれぞれ実行すれば良いのか。
Avatar
koher 10-Nov-17 06:32 AM
うーん、それってでも複数 gysb.json で同じライブラリが指定されてた場合、多重ビルドにならない?そこは頑張って回避?
Avatar
omochimetaru 10-Nov-17 06:32 AM
複数gysb.jsonをマージしてビルドすることは考えてなかった
Avatar
koher 10-Nov-17 06:33 AM
ん?だって
gysb Sources/Foo/*.gysb Sources/Bar/*.gysb
みたいなことがしたいんじゃないの?
Avatar
omochimetaru 10-Nov-17 06:34 AM
↑の例なら、 Sources/gysb.json が置いてあればうまく動くけど
Sources/foo/gysb.json と Sources/bar/gysb.json が置いてある場合
一つのビルドにはできない
という想定でした
実際、違うライブラリだけど同じターゲット名、とかが出てくるとマージしようもないし。
Avatar
koher 10-Nov-17 06:35 AM
マージして重複排除でライブラリビルドして、実行はディレクトリ単位にすれば競合があっても解消できそう。
親と子で競合したらダメだけど。
Avatar
omochimetaru 10-Nov-17 06:35 AM
実行はディレクトリ単位っていうのはどういう意味です?
Avatar
koher 10-Nov-17 06:36 AM
ディレクトリの gysb.json を見る方式だと、ディレクトリ単位でしか指定できないから。
Avatar
omochimetaru 10-Nov-17 06:36 AM
ディレクトリ単位にした時点で実際のSwiftPMワークスペースがばらばらになるから
ライブラリが共有できないです
Avatar
koher 10-Nov-17 06:37 AM
swift_config を導入せずに gysb.json を置く方式にするのであれば、一つのディレクトリの中で設定を切り替えることはできないという意味です。
逆に言うと、同じディレクトリの gysb ファイル同士では設定(ライブラリ)が競合することはない。
Avatar
omochimetaru 10-Nov-17 06:37 AM
マージして重複排除でライブラリビルドして、
このマージするっていうのは
同じgysb.jsonファイル同士を (edited)
同じものと検出するってことを言っている?
Avatar
koher 10-Nov-17 06:38 AM
複数の gysb.json の中に書かれた同じバージョンに解決される同じライブラリを重複ビルドしないようにするということを言ってます。
あー、でもバージョンの解決は Swift PM がやるから無理か。 (edited)
完全一致くらいなら排除できそうだけど・・・
Avatar
omochimetaru 10-Nov-17 06:40 AM
Sources/foo/a.swift.gysb Sources/foo/b.swift.gysb Sources/foo/gysb.json Sources/bar/x.swift.gysb Sources/bar/y.swift.gysb Sources/bar/gysb.json こうなっているときに
a.swift.gysb と b.swift.gysb を、 一つのPackage.swift でビルド x.swift.gysb と y.swift.gysb を 一つのPackage.swiftにして ビルド (edited)
っていうふうにすることを考えているけど
foo/gysb.json と bar/gysb.json をマージして、ライブラリをまとめてビルドするのだとして、
Avatar
koher 10-Nov-17 06:41 AM
Package.json は Package.swift の間違い??
Avatar
omochimetaru 10-Nov-17 06:41 AM
その場合、Package.swift は1つで、そこに、a.swift.gysb , b.swift.gysb , x.swift.gysb, y.swift.gysb が所属して、コンパイルするってイメージですか? (edited)
その考えはわかって、最初そういう意味だと思ったんですけど
実行はディレクトリ単位にすれば競合があっても解消できそう。
その場合この「実行はディレクトリ単位」の概念がわからなかった。
Avatar
koher 10-Nov-17 06:43 AM
そうかー、ビルドを Swift PM に依存してる時点で同一ライブラリであっても Package.swift 間で共有できないのか。 .build 以下をコピーする処理をいれれば共有できるかもだけど。
Avatar
omochimetaru 10-Nov-17 06:43 AM
ああ、異なるPackage.swiftがあるけど依存ライブラリのバイナリは再利用することを想定していたんですね
それはSwiftPMの仕様上うまくできなそうと考えています (edited)
Avatar
koher 10-Nov-17 06:44 AM
そうです < 異なるPackage.swiftがあるけど依存ライブラリのバイナリは再利用することを想定していたんですね
Avatar
omochimetaru 10-Nov-17 06:45 AM
SwiftPMは結構細かいことを中でいろいろやっているので
あんまり途中成果物のバイナリを触って何かするっていう系は
うまくいかなそうだなあと思ってます
昨日 @norio_nomura がいろいろ試した結果もそう思った
Avatar
norio_nomura 10-Nov-17 06:46 AM
そもそも依存ライブラリの作りによっては、ライブラリのバイナリが生成されない。 (edited)
Avatar
omochimetaru 10-Nov-17 06:46 AM
ああ、それもありましたね。
それが一番ビックリしたんだった。
Avatar
koher 10-Nov-17 06:47 AM
うーん、そしたら、
Avatar
omochimetaru 10-Nov-17 06:48 AM
foo/gysb.json と bar/gysb.json でそれぞれ Package.swift 作って2回ビルドでいいと思いますよ。
Avatar
koher 10-Nov-17 06:48 AM
↓ 2 回実行
Sources/Foo/gysb.json Sources/Bar/gysb.json
Avatar
omochimetaru 10-Nov-17 06:48 AM
Sources/gysb.json だけにしてけば 1回ビルドにできるのだし。
Avatar
koher 10-Nov-17 06:49 AM
Souces/gysb.jsonSources/Foo/gysb.json をマージ、 Souces/gysb.jsonSources/Bar/gysb.json して 2 回実行
Souces/gysb.json Sources/Foo/gysb.json Sources/Bar/gysb.json
(差分だけを Foo/gysb.json 等に記述することを想定)
Foo, Bar 以下のすべての gysb ファイルに対して 1 回で実行
Souces/gysb.json
とかかなぁ。
もちろん recursive 指定の場合。
Avatar
omochimetaru 10-Nov-17 06:51 AM
そもそもそんなにSources/gysb.json と Sources/Foo/gysb.json で何か分割定義したいと思わないと思うんですよ
あくまでメタプログラミングのためにつかうライブラリだから
Avatar
koher 10-Nov-17 06:51 AM
そうですね・・・
Avatar
omochimetaru 10-Nov-17 06:52 AM
FooではYAMLを読むしBarではXMLを読むからっていって
別に Sources/gysb.json で YAML と XML 両方のライブラリぶち込んでおいて
それでFooの管理上困るってことも無いと思う。
それは要望が出てきてから考えるとして、とりあえずは gysb.json 一個に対して 1 Package.swift で良いと思う
それはそれとして、 %! swift_conifig はやめてディレクトリ遡り探索の gysb.json にしようと思います
そのほうが 同じgysb.json 配下の gysbテンプレート達に対して、特定のファイルだけ変換するってことができる。
swift_config 方式だと全部にその指定を書かないといけないからめんどくさい
Avatar
koher 10-Nov-17 06:55 AM
お、いいですね < %! swift_conifig はやめてディレクトリ遡り探索の gysb.json にしようと思います
include も廃止?
Avatar
omochimetaru 10-Nov-17 06:56 AM
include は必要だと思う。
Avatar
koher 10-Nov-17 06:56 AM
むー
Avatar
omochimetaru 10-Nov-17 06:56 AM
ちょっと共通のメタプログラミング用の関数とかは生える事が結構あって
でもそれをわざわざSPMパッケージにしてリポジトリをわけるのは
面倒な場合があるだろうから、その場で結合できたほうが良さそう
あ、でもあれか
gysb.json で
結合するファイル達として指定できるようにするという手はあるな。
同じ理由でincludeを全部に書くのは面倒だから。
Avatar
koher 10-Nov-17 06:57 AM
その方が %! という複雑性を持ち込まなくてよさそう。
Avatar
omochimetaru 10-Nov-17 06:57 AM
そうですね
Avatar
koher 10-Nov-17 06:58 AM
どちらかというと include したいのはテンプレートそのものの include だと思うけど
( HTML 生成するときのヘッダー、フッターとか)
それも関数化して gysb.json で指定でできるかな?
Avatar
omochimetaru 10-Nov-17 06:59 AM
テキストのinclude 、 コード ( % { } の内側 ) のinclude、テンプレートのinclude
の3種類がありえるとおもったので今は include_code () だけがあるんですが
テンプレートのincludeにした場合、それ自体は、 %{ } で包まれた中にswiftコードを書いたファイルになるんですが
それが swift ファイルにならない (構文上) .swift.gysb になってしまう
Avatar
koher 10-Nov-17 07:00 AM
↓とかできるんだっけ?
% func foo() { FooFooFoo % } % for _ in 0..<3 { % foo() % }
Avatar
omochimetaru 10-Nov-17 07:00 AM
というのが微妙だなあと思っていて
できますね
Avatar
koher 10-Nov-17 07:00 AM
↓結果
FooFooFoo FooFooFoo FooFooFoo
Avatar
omochimetaru 10-Nov-17 07:00 AM
そうなるはず。
で、swift.gysb になっちゃうと、再帰実行とかで巻き込まれるんですよね・・・
Avatar
koher 10-Nov-17 07:02 AM
よくわかりません・・・
Avatar
norio_nomura 10-Nov-17 07:03 AM
gysb.jsonの中に記述できる様にしてしまうとか。
Avatar
omochimetaru 10-Nov-17 07:03 AM
jsonの中にswiftを書くのは辛いと思います
Avatar
norio_nomura 10-Nov-17 07:03 AM
yamlならいけるかな
Avatar
omochimetaru 10-Nov-17 07:03 AM
えっと、 include_code で取り込まれるファイルは
それ単体でvalidなswiftソースです
Avatar
koher 10-Nov-17 07:03 AM
yaml ならいけるかもしれませんが、 gysb の実行に YAML パーサが必要になって依存が生まれてしまいそう・・・
Avatar
omochimetaru 10-Nov-17 07:04 AM
func taxRate() -> Float { return 1.08 }
とかこういうファイルなわけです。
Avatar
koher 10-Nov-17 07:04 AM
なるほど、何でもテキストを展開するというわけではないのか。
Avatar
omochimetaru 10-Nov-17 07:04 AM
でも、 @koher のいうように、 テンプレートをインクルードする機能だとしたら
%{ func taxRate() -> Float { return 1.08 } }
こういうファイルを用意することになって・・・
このファイル名は metalib.swift.gysb とかになる。
で、さっきの Sources の例でいえば
Sources/foo/a.swift.gysb // こいつが それを読みに行く Sources/foo/metalib/metalib.swift.gysb
たとえばこういうファイルツリーにしたくなると思います。
で、さっきまでの議論を前提に考えて、
$ gysb --source-dir Sources
を実行すると・・・
Sources/foo/metalib/metalib.swift.gysb が 処理対象になって、 自分を自分の上部にincludeしようとして、無限ループして壊れる。
Avatar
koher 10-Nov-17 07:06 AM
そういうことか。
Avatar
omochimetaru 10-Nov-17 07:06 AM
これは困ったな、という話です。
今の仕様であれば、インクルードするのはテンプレートではなくでコードなので、 Sources/foo/metalib/metalib.swift が置かれているけど、これはgysbの実行には関与しないのでうまくうごく。
Avatar
koher 10-Nov-17 07:07 AM
foo/gysb.json に metalib の include を記述とか?
Avatar
omochimetaru 10-Nov-17 07:08 AM
再帰探索で metalib.swift.gysb が見つかったときに、これはinclude用だから処理対象からはずそう、 っていう制御をするってことですか?
Avatar
koher 10-Nov-17 07:09 AM
うーん、 gysb から読み込む swift ファイルおくとかは Swift PM で壊れたりしないかな?ディレクトリ分けておけば Package.swift でコントロール可能?
@omochimetaru はい。 include 用のディレクトリを明記するとか。
Avatar
omochimetaru 10-Nov-17 07:10 AM
ターゲットを分けちゃうと public にするとかいろいろ出てきて面倒なんで、シンプルにテキストとして結合されるのが便利な気がします
いま想定してるのはさっきの func taxRate() みたいな、ちょっとしたやつ。
Avatar
koher 10-Nov-17 07:11 AM
Swiftファイルを読み込むってのは微妙そう。インクルードされるファイルは gysb でも swift でもないべきでは?
gysb.gysb とか?
Avatar
omochimetaru 10-Nov-17 07:12 AM
テンプレートだけどインクルード用としてわかるようにする、っていう手はありますね
拡張子を gysbi にするとか。
Avatar
koher 10-Nov-17 07:12 AM
ネスト数が必要かと思ったけど、起点を gysb にすればいいだけだから特に問題ないか。
gysbi が gysbi を include するような場合でも
Avatar
omochimetaru 10-Nov-17 07:13 AM
それは大丈夫ですね。
Avatar
koher 10-Nov-17 07:14 AM
でも gysb だとマズイよね。ディレクトリで再帰的に指定されるような場合、インクルード用ファイルも単独で展開されちゃう。
Avatar
omochimetaru 10-Nov-17 07:14 AM
gysbi が gysbi を include する
これは、ファイルの中に include 命令が書けるってことになってるとは思うけど・・・
拡張子が gysb だと面倒なことになりますね
gysbi が良さそうだなあ。
template の include なのであれば
Avatar
koher 10-Nov-17 07:15 AM
テキストで include する機能だったら、どのラインに展開するかも重要だから %! 的な構文は避けられなさそう。
Avatar
omochimetaru 10-Nov-17 07:15 AM
テキストを注入する効果もあるわけなので
そうそう。
Avatar
koher 10-Nov-17 07:15 AM
ってか、 gysb 以外なら拡張子なんでもいいのか。
Avatar
omochimetaru 10-Nov-17 07:15 AM
まあそうです。
includeを考えていくと %! から逃げられないですね
まあgybはそれはできないですけど。
Avatar
koher 10-Nov-17 07:16 AM
%! include("path/to/file")
の行をそのファイルの中身で展開するだけ。
Avatar
omochimetaru 10-Nov-17 07:16 AM
gybはメタpythonとしてのimportがあるだけだからテキストのincludeはできない
Avatar
koher 10-Nov-17 07:17 AM
Jekyll の include の構文は↓
{% include footer.html %}
このパスに変数使えたりする
{% include {{ page.my_variable }} %}
ここまで来るとさらにメタになるけどカオスかな?
んー、でも
↓とかもあり得る?
% for i in 0..<10 { %! include("file\(i).gysbi") % }
Avatar
omochimetaru 10-Nov-17 07:20 AM
現状は %! のマクロ言語はテンプレート処理系の前段にあるとしています
CコンパイラとCプリプロセッサの関係と一緒
現実的に↑は無理で、なぜなら、
Swiftとしてのコンパイルをして実行して
でてきたものを再びテンプレートとして処理するっていうふうに
Swiftコンパイル実行が何回も繰り返されるモデルになるので
Avatar
koher 10-Nov-17 07:21 AM
include を関数として実装できないかな?
Avatar
omochimetaru 10-Nov-17 07:21 AM
実行も遅いし変なことになったときわけがわからなくなりそう。
テキスト注入する関数としては実装できますが
Avatar
koher 10-Nov-17 07:21 AM
ファイルを読み込んでその内容を write する
Avatar
omochimetaru 10-Nov-17 07:21 AM
いまやりたいのはSwiftのメタライブラリを提供するシナリオだから
includeをコンパイルする時点でコンパイルエラーになって駄目ですね
Avatar
koher 10-Nov-17 07:22 AM
そうだなぁ。
Avatar
omochimetaru 10-Nov-17 07:22 AM
include_text: Swift上で実装できる include_template: Swiftコンパイル前に処理しないといけない
Avatar
koher 10-Nov-17 07:24 AM
Swift の関数を読み込むことはできないけど、テンプレートを読み込むことはできるんじゃない? gysbi ファイルに対して gysb を実行して得られた文字列を挿入すれば。
Jekyll はそっちの挙動だと思う。
Avatar
omochimetaru 10-Nov-17 07:25 AM
gysbコマンドを実行して結果を注入するってことですか?
Avatar
koher 10-Nov-17 07:25 AM
はい。
Avatar
omochimetaru 10-Nov-17 07:25 AM
それはまあできるけど、Swiftの関数を読み込みたい・・・
Avatar
koher 10-Nov-17 07:26 AM
関数読み込みは gysb.config で記述できそう。
個別に Swift ファイルのパスを指定するだけで。
Avatar
omochimetaru 10-Nov-17 07:26 AM
そうですね。
機能としては現状の %! include_code を
Avatar
koher 10-Nov-17 07:26 AM
Swift ファイルは gysb じゃないから無限再帰問題もないし。
Avatar
omochimetaru 10-Nov-17 07:26 AM
jsonにgysb.jsonに書くようにするってことですね
Avatar
koher 10-Nov-17 07:27 AM
はい。
Avatar
omochimetaru 10-Nov-17 07:27 AM
それはありだと思います。
テンプレートを読み込みたいっていったのは @koher だし・・・
Avatar
koher 10-Nov-17 07:27 AM
テンプレートエンジンとしてはその機能はほしいかと思ったけど、とりあえずなしでいいと思います。複雑化するし。
そうすれば %! も排除できる。
Avatar
omochimetaru 10-Nov-17 07:28 AM
そうですね > %!
しばらく離席します
Avatar
norio_nomura 10-Nov-17 07:31 AM
brewのバイナリ配布、sourceryがSwiftPMでビルドしたものを使ってる。 https://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
実行環境のSwiftバージョン依存を減らせるから、バイナリ配布はそのうち必要。
Avatar
koher 10-Nov-17 07:33 AM
@mono さんも LicensePlist を brew で配布してたような。 (edited)
Avatar
mono 10-Nov-17 07:34 AM
PR来て途中まで対応しつつ、実はまだ対応できてないです( ´・‿・`)
🙃 1
Issue: #52 I hope I can install this library with CocoaPods. I tried installing with CocoaPods by referring to SwiftLint etc. I did not actually register with CocoaPods, so I can not confirm whethe...
Avatar
norio_nomura 10-Nov-17 07:35 AM
配布手続きはそれほど難しくないです。 (edited)
Avatar
koher 10-Nov-17 07:35 AM
PR や issue で音信不通悲しいですね😂
Avatar
mono 10-Nov-17 07:36 AM
分かれば簡単そうとは思いつつ、初めてだとそれなりに手間取りそうと思って敬遠しちゃっていました 🐶
その後1回も突っついてないだけなので、何かしらアクションすれば続きできそうですが(あるいは自分で続きやっても良いですが)
あ、完全に勘違いしていました。
brewはやってます。
CocoaPods配布が途中でした 🐶
でも、brewもバイナリ配布ではなくビルド必要な形式にしちゃっています。 https://qiita.com/mono0926/items/c32c008384df40bf4e41 (edited)
mono0926/LicensePlist という、Carthage・CocoaPodsおよび手動指定ライブラリから、iOS設定アプリに載せられ...
👍 1
Avatar
koher 10-Nov-17 07:40 AM
LicensePlist は CocoaPods でインストールしているライブラリのライセンス情報の生成には対応しているけど、 LicensePlist 自体の CocoaPods でのインストールが未対応ってことですか?
Avatar
mono 10-Nov-17 07:42 AM
そうです。
Avatar
koher 10-Nov-17 07:42 AM
SwiftPM や Carthage と比べると複雑ですよね・・・
Avatar
mono 10-Nov-17 07:42 AM
Homebrewでのバイナリ配布は途中までやりかけたものの少し面倒そうと感じていたところに ishkawaさんからこうリプライいただいて、省略しちゃいました。 https://twitter.com/_ishkawa/status/863662412196597760?ref_src=twsrc%5Etfw&ref_url=https%3A%2F%2Fqiita.com%2Fmono0926%2Fitems%2Fc32c008384df40bf4e41
@_mono それは試したことないですね。自分はbrewで入ればなんでも良いか〜って思ってCarthageの真似で済ませちゃいました。
Avatar
koher 10-Nov-17 07:44 AM
Swift 界隈以外に使ってもらうためのツールならバイナリ配布した方がいいかも?
Avatar
mono 10-Nov-17 07:46 AM
成果物がiOSアプリ用なので、その辺りはあまり問題ないかもです。
Avatar
koher 10-Nov-17 07:46 AM
LicensePlist は大丈夫そうですね。 gysb はバイナリも要りそう。
Avatar
mono 10-Nov-17 07:46 AM
あ、なるほど、そちらはそうですね。
あと、LicensePlistの場合は、Swift 4対応するとまだXcode 8メインで使っている人がビルドできなくなっちゃうのでそのケアのためにまだ3のままです 🐶
Avatar
norio_nomura 10-Nov-17 07:47 AM
ああ、tapにしたのですね。>ビルド必要な形式
Avatar
mono 10-Nov-17 07:49 AM
tapかどうかってビルド必要とは関係なかったような?? bottles対応を省いたからビルド必要、という認識でした。
Avatar
norio_nomura 10-Nov-17 07:49 AM
bottles対応ってオプトインだったかな?勝手にビルドされてた様な…
Avatar
mono 10-Nov-17 07:52 AM
bottles do ... end にバイナリの置き場所書けば対応で、省略すればインストール先でビルド必要な認識でした。 (edited)
## はじめに Homebrewは自作のライブラリを公開することが割と楽な機能を提供してくれている。しかしながら、その作業全体についてちゃんと書いてくれているブログが少ないので、備忘録として自分の作業を晒しておく。なお、自分のgi...
Avatar
omochimetaru 10-Nov-17 07:52 AM
gysbはテンプレート言語がswiftで、テンプレートを描画するためにswiftのビルド実行をしているので
gysb自体がビルドできない環境ではgysbを使うことができないと思います
Avatar
norio_nomura 10-Nov-17 07:54 AM
gysbをビルド出来るswiftバージョンと扱うテンプレートに書かれたswiftバージョンが違う場合に、バイナリ配布だと回避できるよね、と。
Avatar
omochimetaru 10-Nov-17 07:54 AM
たしかに・・・
Avatar
norio_nomura 10-Nov-17 07:56 AM
https://github.com/Homebrew/homebrew-core/ へのformula PRは、CIがビルドに成功したらボトリングしてくれます。まあ、tapでも自前でボトリングすればバイナリ配布は出来るのかな。
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
Avatar
mono 10-Nov-17 07:57 AM
あ、なるほど、前者を知らなかったです。 後者でやろうとして面倒で一旦省略しました。
Avatar
koher 10-Nov-17 09:50 AM
[swift-evolution] update on forum Ted Kremenek via swift-evolution The decision to move to a forum was announced a while ago, and it hasn’t appeared yet. I think we will be making the move soon and I wanted to provide some reasons why it was delayed and what comes next. ... My hope is that process will start in December.
Avatar
omochimetaru 10-Nov-17 03:18 PM
@koher gysb.json と include_files 機能できました。マクロ機能を排除できました。アドバイスありがとうございました。
👍 1
Avatar
norio_nomura 10-Nov-17 11:48 PM
yaml ならいけるかもしれませんが、 gysb の実行に YAML パーサが必要になって依存が生まれてしまいそう・・・
一応書いておくと、YamsはCodableをサポートしたYAMLパーサです。Yams自身には外部ライブラリ依存はなくて、利用実績としてはSwiftLintが.swiftlint.ymlのパースに使っています。
Avatar
omochimetaru 11-Nov-17 04:11 AM
gysb.jsonではなくgysb.ymlも書けたほうが良いですかね? 手書き想定ファイルだしそうかな
Avatar
koher 11-Nov-17 06:05 AM
@norio_nomura gysb から Yams 等への依存が生まれるという意図でした。依存自体は悪くないんですが、なくせるならなくした方が望ましいとは思うので。
👍 1
Avatar
omochimetaru 11-Nov-17 11:18 AM
CIができたから次はHomebrewじゃい、と思ったが、monoさんの記事読んで、なんかめんどくさそうだな・・・って気分
🐶 1
Avatar
norio_nomura 11-Nov-17 12:06 PM
改めてmonoさんの記事を読んだけど、tap作る手順は面倒いね。homebrew-coreへPR出す方が簡単なのでは…
👀 1
Avatar
mono 11-Nov-17 12:09 PM
それぞれの長所短所あまり把握し切らず、何となく最近のはtapが多いかな??と思いつつそっちにしました。 (edited)
Vaporとかもtapですね( ´・‿・`)
Avatar
omochimetaru 11-Nov-17 12:13 PM
とりあえずtapならオレオレで勝手にできるから楽そう
Avatar
mono 11-Nov-17 12:15 PM
@_mono 初回は苦戦した記憶がありますが、1度やれば簡単だった気がします。参考になるかわかりませんが、当時のメモを貼っておきますね。 https://t.co/OBZtRlwl1S
そういえば、あまり深く考えずにこれをベースにした、というのがtapにした大きな理由でした( ´・‿・`)
Avatar
omochimetaru 11-Nov-17 12:16 PM
なるほど
Avatar
Avatar
omochimetaru 11-Nov-17 12:16 PM
やべえ・・・
ちょっと変えるだけでタグのプッシュとtarのDLとハッシュの計算が必要や・・・
Avatar
mono 11-Nov-17 12:17 PM
LicensePlist - A license list generator of all your dependencies for iOS applications
そのあたり苦手ですが、がんばって書きました🐶
Avatar
norio_nomura 11-Nov-17 12:18 PM
https://github.com/Homebrew/homebrew-core/fork を開いてforkして、remote登録:
$(brew --repository homebrew/core) git remote add omochi https://github.com/omochi/homebrew-core.git
したら、次のコマンドでformula作成:
brew create https://github.com/omochi/gysb/archive/0.8.6.tar.gz
して、出来たgysb.rbdepends_on, def install, test dohttps://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb 辺りを参考に設定して、
brew install --verbose --debug gysb
でインストールテストして、
cd $(brew --repo homebrew/core) git checkout -b gysb git add Formula/gysb.rb git commit git push https://github.com/omochi/homebrew-core/ gysb
してPR、って感じかな?
GitHub is where people build software. More than 25 million people use GitHub to discover, fork, and contribute to over 71 million projects.
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
👀 1
Makefileとか不要。
class Gysb < Formula desc "Generate your swifty boilerplate" homepage "" url "https://github.com/omochi/gysb/archive/0.8.6.tar.gz" sha256 "139fd7225442c74e943b32716158a3ea5bd438241372a3cf913fd5313793248e" depends_on :xcode => ["9.0", :build] def install system "swift", "build", "--disable-sandbox", "-c", "release", "-Xswiftc", "-static-stdlib" bin.install ".build/x86_64-apple-macosx10.10/release/gysb" end test do # `test do` will create, run in and delete a temporary directory. # # This test will fail and we won't accept that! For Homebrew/homebrew-core # this will need to be a test that verifies the functionality of the # software. Run the test with `brew test gysb`. Options passed # to `brew install` such as `--HEAD` also need to be provided to `brew test`. # # The installed folder is not in the path, so use the entire path to any # executables being tested: `system "#{bin}/program", "do", "something"`. system "true" end end
Avatar
omochimetaru 11-Nov-17 12:19 PM
bin.install はなんですか?
Avatar
norio_nomura 11-Nov-17 12:20 PM
https://docs.brew.sh/Formula-Cookbook.html を見ると大体わかる。
🍺 The missing package manager for macOS
👀 2
PR開くとチェックリストがテンプレートに載ってるので、追加でそれらに載ってるテストが必要。
Avatar
omochimetaru 11-Nov-17 12:24 PM
ユーザー増えてきたら本家入り考えることにします
Avatar
norio_nomura 11-Nov-17 12:25 PM
一度掲載されたら、次回バージョンアップからはコマンドライン1発でPR開くところまでいけたはず。 https://github.com/realm/SwiftLint/blob/master/Makefile#L114
SwiftLint - A tool to enforce Swift style and conventions.
Avatar
omochimetaru 11-Nov-17 12:27 PM
なるほど。それは楽だ。。
Avatar
norio_nomura 11-Nov-17 12:29 PM
上で書いたFormulaはtest dosystem "true"とか書いたけど、そこは真面目に書き換えないといけない。
テストはsandbox環境下で行われるので、sandboxで動かない機能をテストしたりすると失敗する。
sourceryの場合は期待したバージョンをsourcery --versionで返すかどうか、かな。
Avatar
omochimetaru 11-Nov-17 12:38 PM
ふむふむ
Avatar
norio_nomura 11-Nov-17 12:46 PM
あ、sourceryはsandboxのせいで、本来のテストが出来てないみたいだな。 本来のテストは真面目にコード生成してる。 https://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb#L32-L54
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
gysbのテスト記述はこれを参考に出来そう。
Avatar
omochimetaru 11-Nov-17 12:49 PM
なるほど brew と ruby の道具で書いてありますね
Avatar
norio_nomura 11-Nov-17 12:51 PM
この辺りが自前tapリポジトリを使ったとしても通用するのかどうかは知らないです。
homebrew-coreもtapなので、いけそうな気もしますが。
Avatar
lovee 13-Nov-17 04:37 AM
そういえばSSSやってる人はみんなVaporとかKituraとかPerfectとかどれでやってますか?
Avatar
omochimetaru 13-Nov-17 04:37 AM
#server-side チャンネルがいいかも
Avatar
lovee 13-Nov-17 04:38 AM
あったそんなチャンネル!
Avatar
koher 14-Nov-17 04:28 AM
swift - The Swift Programming Language
Avatar
omochimetaru 14-Nov-17 04:30 AM
朝見たけどまだ何もなさそうだった
Avatar
koher 14-Nov-17 04:30 AM
何が起こるんだろう・・・
Avatar
omochimetaru 14-Nov-17 04:36 AM
Android対応とかですかねえ
Avatar
koher 14-Nov-17 05:53 AM
うーん、 Android は Kotlin 採用したし、 Swift だと JVM で動かないし、違いそうな気がするなぁ。 Chris Lattner がらみかな?
Avatar
omochimetaru 17-Nov-17 01:56 AM
GoogleのSwift fork、本家に Fuchsia OS 対応のプルリク投げてる https://t.co/jPsh9Kvi0h
Avatar
tarunon 17-Nov-17 01:57 AM
Fuchsia is a capability-based, real-time operating system (RTOS) currently being developed by Google. It was first discovered as a mysterious code post on GitHub in August 2016, without any official announcement. In contrast to prior Google-devel...
Avatar
omochimetaru 21-Nov-17 03:43 AM
https://bugs.swift.org/browse/SR-6103 この前投稿した LoE のバグが解決された よかった
Avatar
tarunon 21-Nov-17 03:43 AM
ズル
Avatar
omochimetaru 21-Nov-17 03:43 AM
tarunonのバグは・・・
Avatar
Avatar
koher 21-Nov-17 03:44 AM
@omochimetaru Assignee 担ってるけど、何かアクションを求められてるの?
Avatar
omochimetaru 21-Nov-17 03:45 AM
あれ、ほんとうだ
Avatar
hiragram 21-Nov-17 03:45 AM
勝手に直せやだったらウケる
Avatar
omochimetaru 21-Nov-17 03:45 AM
いま resolved だけど、 closed に俺がするんか?
コメント欄で聞いてみる
Avatar
tarunon 21-Nov-17 03:48 AM
僕の唯一のResolvedは担当者無しやで
適当なんちゃう?
そもそもそれも明らかに治ってるのに音沙汰なかったからこれ治ってるよね?って聞いたら解決済みになったやつ
Avatar
omochimetaru 21-Nov-17 03:49 AM
6126は CC joe groff ついたけど 6304については完全に無だね
Avatar
tarunon 21-Nov-17 03:49 AM
感情が消えた
Avatar
omochimetaru 21-Nov-17 03:49 AM
投票しておいた
Avatar
tarunon 21-Nov-17 03:50 AM
6126はそもそも変性のルールがほこ×たてしてるからなぁ
ほこたてで変換したら変なのでた
Avatar
norio_nomura 21-Nov-17 03:52 AM
動作確認はしたの?>Assignee
Avatar
omochimetaru 21-Nov-17 03:52 AM
いや、まだです
Tracking internally as rdar://35215926. ↑こうなっちゃった時点で
それについて再現テストがたされたのかとか
よくわからんのですよね
僕が確認することより再発防止のためにテスト追加することが一番大事だと思うんですけど・・・
Avatar
norio_nomura 21-Nov-17 03:55 AM
PRではテストが追加されてるみたいだけど。
Avatar
omochimetaru 21-Nov-17 03:55 AM
ですね。ちょうど今見てました。
+struct ParameterizedStruct<T> { + mutating func takesFunctionWithGenericReturnType(_ f: (Int) -> T) {} +}
これがArrayに相当してるのか
Avatar
norio_nomura 21-Nov-17 04:03 AM
とりあえず、issueに載せたコードを動かしてみるといいのでは?w
Avatar
omochimetaru 21-Nov-17 04:04 AM
そうですね、マージされてるし、あとでsnapshot落としてきて試してみます。
Avatar
norio_nomura 21-Nov-17 04:06 AM
あ、まだこのPRを含むsnapshotは無いみたい。
Avatar
omochimetaru 21-Nov-17 04:06 AM
あれ、でもmaster に merged だから
a
November 15, 2017
Avatar
norio_nomura 21-Nov-17 04:07 AM
git tag --contains cf9a09e18dba7a7fe0506381589fbf0f4bb99a98 で何も出ない。
Avatar
omochimetaru 21-Nov-17 04:07 AM
mergeされたのが17日か
dailyが15日以降まだ来てないんですね。CIがコケてるのかしら。
Avatar
norio_nomura 22-Nov-17 12:43 AM
swift-DEVELOPMENT-SNAPSHOT-2017-11-21-a出てる。
Avatar
omochimetaru 22-Nov-17 02:59 AM
DL中
Avatar
Biacco42 22-Nov-17 08:04 AM
#beginner-help が別の話題が進んでるんで、こちらで質問させてください。Swift で C++ の const 引数みたいなことって method / closure でできるんですっけ?
Avatar
t.ae 22-Nov-17 08:07 AM
method / closureでできるの意味がいまいちわからないですが
Avatar
tarunon 22-Nov-17 08:08 AM
inoutじゃない値型は全部copyなので実用上constになる気がします
Avatar
Biacco42 22-Nov-17 08:10 AM
すいませんわかりづらい書き方でした。引数で渡す class をその method 内で変更しないことを示せるのかな?と思って。
Avatar
tarunon 22-Nov-17 08:11 AM
classはあきらめて
Avatar
Biacco42 22-Nov-17 08:11 AM
ですが、そもそも class に non mutating な method が定義できないので、const 性を保証できないのでそれはおかしいというツッコミを受けました(報告)
Avatar
tarunon 22-Nov-17 08:11 AM
残当
🙏 1
😭 1
Avatar
omochimetaru 22-Nov-17 08:12 AM
struct にすれば > inoutじゃない値型は全部copyなので実用上constになる気がします < このとおり
あとは class なら親クラスを readonly な type にして サブクラスで mutating なメソッドを一通り実装すれば・・・
引数で渡す class をその method 内で変更しないことを示せる
これじたいはできるよ。
Avatar
tarunon 22-Nov-17 08:13 AM
readonlyをprotocolで表現してprotocol型で渡した方が良いですね
流石にclassは面倒すぎるしlet propertyをvarでoverrideできな…できるの?!
iPhoneなので試せない
Avatar
omochimetaru 22-Nov-17 08:17 AM
たしかにprotocol横付けが楽ですね、ジェネリックだったら 😇
Avatar
Biacco42 22-Nov-17 08:19 AM
今回はジェネリックじゃないので protocol 案でいけそう
🙏
Avatar
tarunon 22-Nov-17 08:19 AM
ジェネリックでもassoctypeつけて関数をジェネリックにすれば動くから出来るまで頑張ろう
Avatar
omochimetaru 22-Nov-17 08:20 AM
ああこの状況なら <X: Proto> でいいのか
Avatar
tarunon 22-Nov-17 08:20 AM
そう
Avatar
omochimetaru 22-Nov-17 08:20 AM
なるほどなるほど
Avatar
Biacco42 22-Nov-17 08:21 AM
たしかに別にプロパティに保管するわけじゃないからいけるのか
Avatar
tarunon 22-Nov-17 08:22 AM
プロパティに保管するならその時にerasureを使うぞ
Avatar
Avatar
tarunon 22-Nov-17 08:47 AM
無駄Optional警察だ!👮
Avatar
omochimetaru 22-Nov-17 08:47 AM
www
そこかいw
Avatar
Biacco42 22-Nov-17 08:47 AM
代入テストで雑にそうしました… 🙏
Avatar
tarunon 22-Nov-17 08:47 AM
あとこれclassはそのままclassなんで意味なくないですか
Avatar
omochimetaru 22-Nov-17 08:48 AM
processPoに渡すクロージャの中ではsetterが呼び出せないから意味あると思うよ (edited)
Avatar
tarunon 22-Nov-17 08:48 AM
あ、これはPoについてConstにしたいのか
Elementについてと勘違いしてた
Avatar
Biacco42 22-Nov-17 08:49 AM
そうです。Po を Const にしたかった
Avatar
tarunon 22-Nov-17 08:50 AM
型パラが妙に多いな
func processPo<X: ConstPo>(po: X, process: (X.Element) -> Void) {
これでok
Avatar
Biacco42 22-Nov-17 08:51 AM
なるほど!
Avatar
tarunon 22-Nov-17 08:53 AM
本当はElementとかも含めて再帰的にConst化したいと思うんですが、今日のswiftではそれをシュッとやるのは無理ですね
structつかおう (edited)
Avatar
Biacco42 22-Nov-17 08:55 AM
たしかに再帰は…
うーんなるほど
あ、でも今回は露出するプロパティが値型なので完全に目的を達成できそう
ありがとうございました
Avatar
koher 22-Nov-17 09:01 AM
これって const の場合と違って、型ごと CostoPo を満たさないといけないの微妙そう。
Avatar
tarunon 22-Nov-17 09:01 AM
そこなんすよね
Avatar
koher 22-Nov-17 09:02 AM
struct じゃダメ? Swift の class は二級市民だと思ってる。
Avatar
Biacco42 22-Nov-17 09:02 AM
そうですね
Avatar
koher 22-Nov-17 09:02 AM
抽象クラスとかもないし。
Avatar
Biacco42 22-Nov-17 09:02 AM
View なのでうーん…
Avatar
tarunon 22-Nov-17 09:02 AM
再起でできるためにはConstableみたいな不毛なprotocolが必要になって、class to type-erasure structな記述をやる羽目になる
Avatar
koher 22-Nov-17 09:03 AM
View に対応した ViewModel を struct で作って渡すとか?
Avatar
tarunon 22-Nov-17 09:03 AM
structだとvar/letですむのに
Avatar
koher 22-Nov-17 09:03 AM
View 自体を操作する関数だとダメだけど。
(でも const にしたいくらいだから View から情報をとりたいだけに見える)
Avatar
Biacco42 22-Nov-17 09:04 AM
そうですね
Avatar
hiragram 22-Nov-17 09:23 AM
caseでenumから値とるやつ、ここまとめられるの知らなかった。
enum Hoge { case fuga(Int) case piyo(Int) var count: Int { switch self { case .fuga(let count), .piyo(let count): // <- ここ return count } } }
Avatar
omochimetaru 22-Nov-17 09:23 AM
えっ、どうなってんの、それ
Avatar
tarunon 22-Nov-17 09:23 AM
protocolはまとめられないよん
Avatar
omochimetaru 22-Nov-17 09:24 AM
同じ let count だからいける?
Avatar
tarunon 22-Nov-17 09:24 AM
同じ具体型なら変数そろえて同一視できる
Avatar
omochimetaru 22-Nov-17 09:24 AM
ワオー知らなかった
Avatar
hiragram 22-Nov-17 09:25 AM
tarunonのいうとおりこれはエラーなった
protocol ProtocolA {} enum Hoge { case fuga(ProtocolA) case piyo(ProtocolA) var count: ProtocolA { switch self { case .fuga(let count), .piyo(let count): return count } } }
Playground execution failed: error: MyPlayground.playground:5:24: error: matching a protocol value in multiple patterns is not yet supported; use separate cases instead case .fuga(let count), .piyo(let count): ^
Avatar
tarunon 22-Nov-17 09:25 AM
前はコンパイラが破壊された
僕の報告一覧にあるよ
一応コンパイルエラーになったから解決なのかな
Avatar
hiragram 22-Nov-17 09:26 AM
おもしろ記法みつけたと思ったら過去にtarunonに破壊も報告も修正もされてるのなんか悔しい
悔しい💢
Avatar
tarunon 22-Nov-17 09:26 AM
そんなおこらんといてや
Avatar
Avatar
omochimetaru 22-Nov-17 09:26 AM
Swift おもしろ記法 探検隊
Avatar
hiragram 22-Nov-17 09:28 AM
@tarunon これなら通りそうなもんだけど、これもだめなんか
protocol ProtocolA {} enum Hoge<T: ProtocolA> { case fuga(T) case piyo(T) var count: T { switch self { case .fuga(let count), .piyo(let count): return count } } }
Avatar
koher 22-Nov-17 09:28 AM
パターンマッチ関連のおもしろ記法と言えば前に教えてもらった↓かなぁ。
let a: Int? = 42 if case let a? = a { print(a) }
Optional Binding よりも意味がわかりやすい。
Avatar
omochimetaru 22-Nov-17 09:29 AM
でた 左辺ハテナw
Avatar
tarunon 22-Nov-17 09:29 AM
あれそれIterator.next()が粉砕されるやつでは
Avatar
koher 22-Nov-17 09:29 AM
これって C で
int *a = ...; *a = 42;
って書くのと似てるよね。
(edited)
Avatar
tarunon 22-Nov-17 09:29 AM
@hiragram そのTが通らないのは謎やね
Avatar
hiragram 22-Nov-17 09:30 AM
だよね。
Avatar
omochimetaru 22-Nov-17 09:31 AM
見た目だけは似てますね・・・ > *a = 42
Avatar
koher 22-Nov-17 09:31 AM
いや、 *aint 型というのと、 a?Int 型というのが。
Avatar
omochimetaru 22-Nov-17 09:32 AM
a? は Int 型ではないですよね
Avatar
tarunon 22-Nov-17 09:32 AM
あ、これはInt型だから虐殺文法ではなかった
Avatar
omochimetaru 22-Nov-17 09:32 AM
代入文の左辺に書けるだけで a? は Optional<Int> だからこそ a の部分だけが Int
この言い方だとCもそうだけど・・・
Cは中身と外見が先にあってデリファレンスするけど、 Swiftのさっきの式は中身がそこで産まれるから逆な感じがする。
Avatar
koher 22-Nov-17 09:34 AM
逆か。 a?Int?aInt か。
C は *aintaint *
Avatar
tarunon 22-Nov-17 09:37 AM
さっきのTが通らないの、Tにprotocol入れられたら壊れるからと思ったけど、今はconditionalな型パラはそもそもprotocol入らないので益々謎だ
その条件付けサボってるのかな
それか将来的にprotocolが来る可能性があって意図してそうやってるか
Avatar
hiragram 22-Nov-17 09:42 AM
抜けてるだけじゃねって印象
@tarunon プロパティじゃなくてメソッドにしたらエラーメッセージがなんか愉快なことになったよ
protocol ProtocolA {} enum Hoge<T: ProtocolA> { case fuga(T) case piyo(T) func value<T>() -> T { switch self { case .fuga(let value), .piyo(let value): return value } } }
error: MyPlayground.playground:6:20: error: cannot convert return expression of type 'T' to return type 'T' return value ^~~~~ as! T
Avatar
tarunon 22-Nov-17 09:44 AM
報告しよう
Avatar
hiragram 22-Nov-17 09:44 AM
as! Tいれると其の行はエラー消えるけどcase文の行がまたさっきのエラーでるんだけどね
つまりvalueはTとして認識できてるんだからそのままコンパイル通ってもいいようなきがするんだけどそういうわけではない?
Avatar
omochimetaru 22-Nov-17 09:44 AM
不思議なエラーだ
Avatar
tarunon 22-Nov-17 09:45 AM
意図的に止めてそう
protocol型で其れが出来ないのは、実際にはprotocol型そのものではなく存在型として振る舞ってることが関係してそうで
型パラは常にprotocolが当てられることを想定した振る舞いになってる
TとTが違うよは意味分からんけどprotocolのそれを踏まえて考えると然もありなん
Avatar
hiragram 22-Nov-17 09:47 AM
文脈的に1個目のTと2個目のTが違う型の可能性ある可能性あるからってことよね
Avatar
tarunon 22-Nov-17 09:47 AM
だね
ただまあエラーメッセージは適切ではないから報告はしといてよさそう、回答も貰えるといいね
Avatar
hiragram 22-Nov-17 09:49 AM
どっから報告するんだっけ。
Avatar
tarunon 22-Nov-17 09:49 AM
bugs.swift.org
Avatar
hiragram 22-Nov-17 09:50 AM
あとで暇みつけて書いておく
こっちの書き方はちゃんとやってくれてうれしい
typealias Tuple = (Int, String) enum Hoge { case fuga(Int) case piyo(Tuple) var value: Int { switch self { case .fuga(let value), .piyo((let value, _)): return value } } }
piyoにくっついてくる値がIntのプロパティをもつようなstructで、caseまとめて書く記法のなかでそのstructのIntのプロパティ取り出せたら便利かと思ったけどそこまでごちゃごちゃしてるならcase分けるわな
Avatar
rintaro 22-Nov-17 09:57 AM
struct のプロパティとかをパターンで抽出するの、昔 swift のソースに無効化された状態であったけど、やらない雰囲気だからって消された覚えがあります。
Avatar
hiragram 22-Nov-17 09:57 AM
おおっ
Avatar
rintaro 22-Nov-17 09:58 AM
別件で Array の要素とマッチさせるのは evolution に何度か上がってた記憶ありますね。
case let [first, second, third]:
みたいな。
Avatar
hiragram 22-Nov-17 10:02 AM
おー。
この場合要素数が2だったらこのcaseにマッチしなくなるのか (edited)
Avatar
Avatar
omochimetaru 22-Nov-17 10:07 AM
そんなのがあったのか〜
Avatar
norio_nomura 22-Nov-17 11:11 AM
error: MyPlayground.playground:6:20: error: cannot convert return expression of type 'T' to return type 'T' return value ^~~~~ as! T
これは真っ当なエラーでは…
Avatar
rintaro 22-Nov-17 11:13 AM
というか、タイプの T使うなら func はこの場合Genericsにすべきでないですね。
Avatar
tarunon 22-Nov-17 11:13 AM
見逃してた
<T>ついてるw
Avatar
omochimetaru 22-Nov-17 11:14 AM
あ、ほんとだ。
Avatar
hiragram 22-Nov-17 11:14 AM
あっ
ごめんなさい 🙏
Avatar
Avatar
rintaro 22-Nov-17 11:16 AM
タイプの型パラshadowしたら警告出すとか有用なのかも。
Avatar
omochimetaru 22-Nov-17 11:17 AM
↑の例は Event と T だからshadowでもないんですよね・・・w
😇 1
Array.Elementも結構引数で受けるときはT, U で書いちゃうし
逆にそのような警告を出す機能があったら、ちゃんとした名前をいつでも使うように心がけるようにはなりそうだ。
Avatar
tarunon 22-Nov-17 11:21 AM
この余分なTあるとnever使えなくなって訳わからなくなるよね
Avatar
omochimetaru 22-Nov-17 11:21 AM
推論がコケるんだよねw
すぐ気づけて良かった・・・
Avatar
tarunon 22-Nov-17 11:22 AM
ハマると、一度ハマった経験がないと気づけなくなる
Avatar
rintaro 22-Nov-17 11:40 AM
https://bugs.swift.org/browse/SR-1420 既に上がっていました。<型パラshadow警告
Avatar
omochimetaru 22-Nov-17 11:41 AM
要望っぽいものも上がってるんですね
Avatar
omochimetaru 22-Nov-17 03:58 PM
sublime text の syntax カラーリング わかってきた
しかし既存の Swift プラグインは残念ながら tmLanguage 形式で
これとがんばって連携していくか、 sublime-syntax 形式での対応を1からやるか・・・
Avatar
rintaro 22-Nov-17 04:03 PM
ほうほう、tmLanguage って TextMate のシンタックス定義なんですね。
Avatar
omochimetaru 22-Nov-17 04:04 PM
そのようです。SublimeText2まではそっちだったけど、SublimeText3から、tmLanguageも使えるけど、独自のsublime-syntaxを使おうねって感じ
スタック付きの正規表現ベースのオートマトンみたいな仕組みっぽい
Avatar
omochimetaru 23-Nov-17 03:10 AM
Swiftのパーサ周りを読んでいたら、 TokentokTok が出てきて、
Tok の定義が全然見つからないと思ったら Token 型のフィールド名が Tok だった・・・
ちなみに tok は enum
Avatar
rintaro 23-Nov-17 04:24 AM
フィールド名を UpperCamelCase にするのは LLVM 文化特有なんですかねー。
Avatar
omochimetaru 23-Nov-17 04:27 AM
Googleは snake_case_ ですね、他のC++プロダクトをそんなに読んでないのでわからないですが
Avatar
omochimetaru 23-Nov-17 01:18 PM
やっぱりxcodeでリーディングしようと思ってclone,update,build-script --xcodeしてxcodeで開いて、
プロジェクトのソースツリーのカオスさに笑ってる
Avatar
tarunon 23-Nov-17 01:19 PM
ソースツリー役に立たないから検索ばっかしてる
Avatar
omochimetaru 23-Nov-17 01:19 PM
Swift がオープンソースになってしばらく経ちます。 コンパイラや標準ライブラリの開発に手を出してみたいけど、リポジトリを落とした後どうしていいかわからない!という方のために、まずは開発環境の構築方法をご紹介します。基本的には[RE...
この記事のスクショとすこし違ってる(Sourcesが無い)
ひらりがこの前言ってた、ファイル名あいまいジャンプできるやつ
役に立ちそう
Avatar
tarunon 23-Nov-17 01:23 PM
⌘⇧Oと⌘⇧Fめっちゃ使うけど結構迷子になるからソースツリー+差分と履歴も使う
ソースツリーの下の検索ボックスの横に時計とgitマークあるので、onにすると最近見たファイルとか差分のあるファイルで絞り込めてソースツリーが使い物になるようになる
Avatar
omochimetaru 23-Nov-17 01:26 PM
なるほど
あ、あった、ここらへんだ
swift/lib/XXX のディレクトリごとに対応するターゲットがあった
Avatar
tarunon 23-Nov-17 01:27 PM
え、、、
俺は一体今まで何を、、、、
Avatar
omochimetaru 23-Nov-17 01:28 PM
上から60%ぐらいのところに
swiftIndex , swiftIDE, swiftIRGen, swiftParse
などのグループがあって、それぞれの中に、SourceFilesとHeaderFilesが入ってて
ここらへんの lib/ XXX / CMakeList と対応してるっぽいね
Avatar
rintaro 23-Nov-17 01:30 PM
なんか、グループの作られ具合、CMakeのバージョンによっても違うのかも。
Avatar
omochimetaru 23-Nov-17 01:31 PM
CMakeList一個が一個のターゲットになってて、Xcodeに噛み合わないやつは、そのままCmakeをたたくだけのスクリプトターゲットになってて、 オプション違い?もバラバラに生成されるから、こんなカオスなのだな
xcodeprojの生成自体は完全にcmake側の機能に任せてるんですかね?
Avatar
rintaro 23-Nov-17 01:32 PM
そのはずですね。 CMake -G Xcode
Avatar
omochimetaru 23-Nov-17 01:33 PM
なるなる
おっしゃー
Tok でジャンプできたぞw
1日消えたw(途中で寝落ちしてた (edited)
Avatar
omochimetaru 23-Nov-17 04:42 PM
--release-debuginfo --xcode でビルドしたら
clang: error: no such file or directory: '/Users/omochi/work/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/Debug/libcmark.a' と出ていて (edited)
実際には /Users/omochi/work/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/RelWithDebInfo/libcmark.a
が生成されているので
--release-debuginfo なのに cmark は --debug で参照しちゃっててうまくいってないみたいなんですけど
--xcode は作業用、 ninja でビルド するのが良いのか? release-debuginfo があまりメンテナンスされていないので、 release にするのが良いのか? とか、どうなんでしょう
Avatar
omochimetaru 23-Nov-17 07:08 PM
あら、 Releaseでやっても同じところでコケた
Avatar
omochimetaru 23-Nov-17 07:16 PM
あっ!
なるほど、build-scriptに渡したconfigurationとは別に、xcode側のいつものconfigurationをちゃんと設定しないといかんのか。
Avatar
omochimetaru 23-Nov-17 07:35 PM
スナップショットの出てるコミットでやってるけど、下記でコケてしまうので、 --xcode のせいなのか、そうでないのか調べるために ninja でもやってみます。
/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/bin/swiftc -apinotes -yaml-to-binary -o /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift/macosx/x86_64/ScriptingBridge.apinotesc -target x86_64-apple-macosx10.9 /Users/omochi/work/swift-source/swift/apinotes/ScriptingBridge.apinotes
Avatar
omochimetaru 23-Nov-17 10:44 PM
いけた。
Avatar
omochimetaru 23-Nov-17 11:12 PM
下記がエラーになる件、
/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/bin/swiftc -apinotes -yaml-to-binary -o /Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift/macosx/x86_64/ScriptingBridge.apinotesc -target x86_64-apple-macosx10.9 /Users/omochi/work/swift-source/swift/apinotes/ScriptingBridge.apinotes
出力先
/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift/macosx/x86_64
が存在してなかったが、
/Users/omochi/work/swift-source/build/Xcode-ReleaseAssert/swift-macosx-x86_64/Release/lib/swift
は存在していたので、 mkdir してやったら、いけました。
Avatar
omochimetaru 24-Nov-17 03:47 AM
あれっ
同じ問題が再現したら報告しようとおもって改めて別マシンでやっていたのだけど
ビルドできてしまった。
snapshot 11/22から11/23に変更したのが良かったのか、 最初からschemeをちゃんとReleaseにしたのが良かったのか、わからんけど・・・
Avatar
omochimetaru 27-Nov-17 04:39 AM
#swift スレの話題がエッジな概念ばかりでてきてて笑うw
Avatar
omochimetaru 29-Nov-17 03:47 AM
has-a パターンを作るときに、機能Xをhas_aで合成する事を表すプロトコルも一緒に定義すると、
エクステンションも併用するとフィールド定義するだけで一通りのプロパティとメソッドが自動的に生える
って事ができて便利だなってなってる
class ViewBindingHelper<Model> { ... } protocol ViewBindingHelperUser { associatedtype Model var helper: ViewBindingHelper<Model> { get } } extension ViewBindingHelperUser { 追加される機能 }
こうしておいて
class ProductListTableView : NSTableView, ViewBindingHelperUser { let helper: ViewBindingHelper<ProductList> = .init() }
(edited)
使う側ではこうやって1行書くともろもろ生える
Avatar
tarunon 29-Nov-17 03:51 AM
これやると諸々のフィールドが他のhas_a関係のprotocoolのフィールドと名前がかぶって…となってとてもつらい (edited)
Avatar
omochimetaru 29-Nov-17 03:52 AM
名前がかぶっちゃうシチュエーションでは User の方のプロトコルコンフォーマンスは解除して、 .helper.method でヘルパ名をネームスペース代わりにするしか無さそう。
Avatar
tarunon 29-Nov-17 03:53 AM
でもまあこのやり口めちゃくちゃ便利なのはそうで
Avatar
omochimetaru 29-Nov-17 03:53 AM
ヘルパオブジェクト以外にも依存メソッドがある場合はどうしようもないね、helperのinitにクロージャで注入しようとかになるね
Avatar
tarunon 29-Nov-17 03:53 AM
subviewとかで使うと捗る場面が結構ある
Avatar
omochimetaru 29-Nov-17 03:54 AM
継承したカスタムビュークラス複数で共通の機能とか?
Avatar
tarunon 29-Nov-17 03:54 AM
そうそう
Avatar
omochimetaru 29-Nov-17 03:54 AM
カスタムビューだと継承で親クラスが注入できないからか。
Avatar
tarunon 29-Nov-17 03:55 AM
Viewだとclassなのでmix-inみたいなことはできなくて
protocolベースで定義してそれをhas-a関係でprotocolでガチャガチャ組み立てていくと、mix-inみたいな感じで書ける(読めるとは言っていない)
Avatar
omochimetaru 29-Nov-17 03:56 AM
わかるなあ
Avatar
tarunon 29-Nov-17 03:57 AM
protocol MyViewProtocol { var button: Button { get } } protocol HasMyViewProtocol: MyViewProtocol { associatedtype MyView: MyViewProtocol var myView: MyView { get } } extension HasMyViewProtocol { var button: Button { return myView.button } }
こんな感じだ
そうするとMyViewをsubviewとして持つ全てのImplementationが、buttonにアクセスできるし、functionの実装をextension MyViewProtocol に置けば全部使えるようになる
Avatar
omochimetaru 29-Nov-17 03:59 AM
あ〜HasXそれ自体もXにするのか
Avatar
koher 07-Dec-17 07:11 AM
「Swiftの暗黒面」じゃない?🤔 https://qiita.com/tarunon/items/844958accc4391097d97
# はじめに SwiftのOptionalを取り巻くあれやこれやについて考えを整理しつつ書きます。 多くの人にとっては役に立たない雑多な話題かもしれません。差し当たりSwift EvolutionのDraftのDraftぐらいの話でし...
Avatar
tarunon 07-Dec-17 07:14 AM
立派な暗黒面ですよ
このままABI安定化とかいい出したらオシマイです
Avatar
koher 07-Dec-17 07:16 AM
タイトルが「Swiftの暗黒面」になるのかと思ってました🙃
Avatar
tarunon 07-Dec-17 07:19 AM
いつもの話のまとめなので、ここの人たちには新鮮味が無さそうなのはちょっと申し訳ないですね 🙏
Avatar
koher 07-Dec-17 07:19 AM
むしろ、ここで話されたことをまとめていくのが大事な気がしてます。
Avatar
tarunon 07-Dec-17 07:19 AM
それはそうw
ディスコまとめ人いない問題
Avatar
hiragram 07-Dec-17 07:20 AM
パーマリンク無いと無理無理…
Avatar
koher 07-Dec-17 07:20 AM
まあ、 iOSDC や try! Swift で発表していくのがいいかと。
あ、 Swift Tweets もありますよwよかったらどうぞ🙂
Avatar
tarunon 07-Dec-17 07:21 AM
We already have the ability to quickly go through pinned messages and recent mentions that bring us towards a certain position in the chat to view that message. And even more recently got the new search feature that is an even more powerful version of that. It would be nice if we can have the ability to obtain and post a permalink of a message where people can click on it and will directly be brought to the position of the original message, instead of having us to manually get users to search for an older message we want them to see.
みんなも!さあ!
Avatar
omochimetaru 07-Dec-17 07:21 AM
@koher Discord Offline登壇のために東京来る予定ありませんか
Avatar
Kishikawa Katsumi 07-Dec-17 07:22 AM
投票しました。
🙆 4
Avatar
koher 07-Dec-17 07:22 AM
@omochimetaru 出張と重なるのが理想的です。
Avatar
omochimetaru 07-Dec-17 07:22 AM
そうですよね、なんかいい出張予定があるといい
Avatar
koher 07-Dec-17 07:23 AM
今年は会社の忘年会やらずに新年会やるらしいからそのとき行くかもだけど、さすがに Discord Offline の開催間隔が狭すぎる気が。 (edited)
Avatar
tarunon 07-Dec-17 07:23 AM
@Kishikawa Katsumi すみませんダブリだった。こっちにもお願いします https://feedback.discordapp.com/forums/326712-discord-dream-land/suggestions/17828437-msg-id-jump
Transform <#msg_id> links into "jump to message" button (like in pins). Alternatively, an inline quote (with a jump button). Right-click a message to extract said id.
Avatar
Kishikawa Katsumi 07-Dec-17 07:24 AM
そっちも投票済みです 💯
💯 3
Avatar
omochimetaru 07-Dec-17 07:26 AM
なるほど>しんねんかい
Avatar
kaza 07-Dec-17 08:14 AM
投票しました ( ・`ω・´)
🙏 2
Avatar
norio_nomura 08-Dec-17 01:57 AM
Swift 4.1で-swift-version 3を使うとSwift 3.3になるぽい。
$ TOOLCHAINS=org.swift.4120171207a swift -swift-version 3 Welcome to Apple Swift version 4.1-dev (LLVM 67b9a8e8c2, Clang e617c83242, Swift 65b4172032). Type :help for assistance. 1> #if swift(>=4.1) 2. let versions = "swift-4.1" 3. #elseif swift(>=4.0.3) 4. let versions = "swift-4.0.3" 5. #elseif swift(>=4.0.2) 6. let versions = "swift-4.0.2" 7. #elseif swift(>=4.0) 8. let versions = "swift-4.0" 9. #elseif swift(>=3.3) 10. let versions = "swift-3.3" 11. #elseif swift(>=3.2.3) 12. let versions = "swift-3.2.3" 13. #elseif swift(>=3.2.2) 14. let versions = "swift-3.2.2" 15. #else // if swift(>=3.2) 16. let versions = "swift-3.2" 17. #endif 18. versions: String = "swift-3.3" 18>
(edited)
👀 3
Avatar
hiragram 08-Dec-17 04:49 AM
@tarunon RxSwiftのBehaviorSubjectから値を取り出すとき subject.value() がthrowsなのってなんでなんだろ
Avatar
tarunon 08-Dec-17 04:50 AM
Errorを購読したらそれ以降はErrorだからやね
Avatar
omochimetaru 08-Dec-17 04:50 AM
BehaviroSubjectってそうなのか〜
Avatar
hiragram 08-Dec-17 04:50 AM
subject.onErrorか
あー。
Avatar
omochimetaru 08-Dec-17 04:50 AM
なるほど〜
Avatar
hiragram 08-Dec-17 04:50 AM
なるほど。
VariableはObserverじゃないからErrorにはなりえないけど、BehaviorSubjectはありうるってことか
Avatar
tarunon 08-Dec-17 04:51 AM
そやね
今後はBehaviorRelayをつかおう
Avatar
hiragram 08-Dec-17 04:51 AM
RxSwiftアップデートせなな…
Avatar
Biacco42 08-Dec-17 12:30 PM
BehaviorSubject でやってしまったマン
Avatar
kaza 08-Dec-17 01:08 PM
RxSwift。。。とてもムズカシイです😱
Avatar
hiragram 11-Dec-17 07:43 AM
#swift の裏番組になりますが、assertやpreconditionを「落ちたり落ちなかったりするチェック」として使ったことなかったなー
Avatar
lovee 12-Dec-17 03:30 AM
#swift-2 の分解能の話で思い出したけど、AVAudioFile もなぜか AVAudioFramePositionInt64 なのに AVAudioFrameCount は逆に UInt32 しかないという不可解な現象 https://qiita.com/lovee/items/8bdf7b58d96d683d31b9
この記事はゆめみ Advent Calendar 2017 の 1 日目の記事です。 また、本記事は実は下書きのまま 1 年近く寝かされ...
Avatar
Avatar
lovee 12-Dec-17 09:02 AM
↑それは AUAudioFrameCount で自分が上げたのは AVAudioFrameCount なんですよな…
それにcountがuint32でpositionがint64になっている現象についての説明もありません
Avatar
norio_nomura 12-Dec-17 09:03 AM
This alias is type `uint32_t` for impedance-matching with the pervasive use of `UInt32` in the Audio Toolbox framework and the C Audio Unit framework APIs, as well as the `AVAudioFrameCount` data type.
(edited)
Avatar
omochimetaru 12-Dec-17 09:04 AM
AU じゃなくて AV か。
Avatar
lovee 12-Dec-17 09:05 AM
じゃあpositionはなぜInt64なのか
Avatar
omochimetaru 12-Dec-17 09:06 AM
ん、ちょっとまって、
AVAudioFramePosition: Int64 A position in an audio file or stream. (edited)
UInt64のこっちは ファイル or ストリームだからバイトオフセットで
AVAudioFrameCount: UInt32 A number of audio sample frames. (edited)
こっちはサンプルフレームの数
だから、良いんじゃないですか?
いや、不自然か?
8bitステレオオーディオなら1フレーム2バイトだから
あ、でも、 var length: AVAudioFramePosition { get } AVAudioFileの長さ自体は Int64の方の型ですね
AVAudioFrameCountは小さいチャンクを扱うときにしか使われてないとかじゃないでしょうか
リアルタイムAPIで0.2秒分の波形が来る、とかそういう時のフレーム数を表現する用で
長い曲データの先頭からの完全なオフセットを数える型ではないとか。
Avatar
lovee 12-Dec-17 09:10 AM
そもそもpositionはcountを超えたり負になったりする可能性ってあります?
Avatar
omochimetaru 12-Dec-17 09:12 AM
非圧縮のWAVファイルで44.1kHZなら 97,391秒だから 27時間分の録音データとかならありえるのでは
iOSなら死んじゃうけどもともとMacのAPIだし。
Avatar
lovee 12-Dec-17 09:13 AM
positionもバイト数のオフセットじゃなくてフレームのポジションなのでそもそも取りうる範囲は0..<countになるはずなんじゃないかと思うのですが…
Avatar
omochimetaru 12-Dec-17 09:13 AM
ファイルの長さは 0..<count じゃなくて 0..<length みたいですよ length The number of sample frames in the file.
lengthの型は var length: AVAudioFramePosition { get }
↑ここをみてます
AVAudioFrameCount (32bitの方の型 ) が出て来るAPIは func read(into buffer: AVAudioPCMBuffer, frameCount frames: AVAudioFrameCount) throws があるみたいです、こっちはバッファに一部を読み取る命令だからサイズが全体より小さくてもおかしくないと思う。
Avatar
lovee 12-Dec-17 09:17 AM
var length: AVAudioFramePosition The number of sample frames in the file. typealias AVAudioFrameCount A number of audio sample frames.
この説明がすでに色々理不尽な気が…(CのAPIに合わせてるのなら逆にじゃあなぜCではcountだけが32bitなのか…
Avatar
omochimetaru 12-Dec-17 09:18 AM
まあその2行だけ見ると意図が不明ですね
AppleのローレベルなAPIにはよくある・・・
Avatar
norio_nomura 12-Dec-17 09:18 AM
ComponentResult AudioUnitRender( AudioUnit ci, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData )
inNumberFrames The number of frames to be rendered.
(edited)
Avatar
lovee 12-Dec-17 09:20 AM
SInt32 startBufferOffset
これだけ読むとやはりCでは両方32bitにしてるけどAVFoundationがなぜかpositionだけ64bitにしてるんですよね…
(edited)
Avatar
omochimetaru 12-Dec-17 09:21 AM
startBufferOffset The starting point of the event, after the beginning of the render.
Avatar
lovee 12-Dec-17 09:21 AM
64bit化したNSFileManagerあたりとの連携のため?
Avatar
omochimetaru 12-Dec-17 09:21 AM
これは曲ファイル全体でのオフセットではなくて
あ、いや、そうなのか?
beggining of renderはプレゼンテーションの開始時刻か
27時間で壊れそう
Avatar
lovee 12-Dec-17 09:23 AM
あ多分再生位置のオフセットはこれかな?
UInt32 bufferOffset; bufferOffset Where in the current buffer the event should occur
(edited)
Avatar
koher 12-Dec-17 09:24 AM
↓ちょっと違うけどひどいと思うやつ。
GL_PROJECTION // Int32 glMatrixMode(GLenum(GL_PROJECTION)) // Obj-C (C) ではそのまま渡せた
(edited)
Avatar
omochimetaru 12-Dec-17 09:25 AM
ああー
それ、 static var GL_PROJECTION: GLenum ってオーバレイ用意してほしいですね。
Avatar
koher 12-Dec-17 09:25 AM
うん (edited)
Avatar
omochimetaru 12-Dec-17 09:25 AM
もともと #define だったマクロがそのまま Int32 としてポーティングされてしまっている
Avatar
norio_nomura 12-Dec-17 09:27 AM
#defineの数値リテラル?は全部基本Int32になるよね (edited)
Avatar
omochimetaru 12-Dec-17 09:28 AM
そのままだとそうっぽいですね
Avatar
koher 12-Dec-17 09:45 AM
そういうことなんだ。じゃあ 32 ビット整数で表せないリテラルがあったら壊れる?↓みたいなの。
#include <stdio.h> #define BIG_NUMBER (0xffffffffffffffff) void printHex(unsigned long long number) { printf("%llx\n", number); } int main(void) { printHex(BIG_NUMBER); return 0; }
Avatar
omochimetaru 12-Dec-17 09:45 AM
そもそも #define NAME "aaa" みたいなのもありえるので
なぞです
とりあえず収まる整数だけInt32としてインポートしてくれるのかも?
Avatar
koher 12-Dec-17 09:46 AM
単純な #define は型を判定してるのかな?
Avatar
omochimetaru 12-Dec-17 09:46 AM
たぶんそうだと思います
Avatar
koher 12-Dec-17 09:47 AM
式が書いてあったりしたらどうしてるんだろ?
Avatar
omochimetaru 12-Dec-17 09:48 AM
見えないとか、静的に計算できるなら見えるとか?複雑なルールがある気がしている
clang-importerの領域だと思う
Avatar
norio_nomura 12-Dec-17 10:01 AM
Appleのドキュメント、ヘッダファイル内のコメント拾えてないな。
AVFoundation.framework/Frameworks/AVFAudio.framework/Headers/AVAudioTypes.h
/*! @typedef AVAudioFrameCount @abstract A number of audio sample frames. @discussion Rationale: making this a potentially larger-than-32-bit type like NSUInteger would open the door to a large set of runtime failures due to underlying implementations' use of UInt32. TODO: Remove rationales. */ typedef uint32_t AVAudioFrameCount;
🙏 1
Avatar
lovee 12-Dec-17 12:43 PM
つまり将来的には64bitになるっと
Avatar
norio_nomura 12-Dec-17 01:54 PM
うーん、そうは書いてないんじゃないかな。
Avatar
norio_nomura 12-Dec-17 02:03 PM
そもそも、データ全体をメモリにマップしなくて済む様にするバッファのサイズを指定するものっぽいから、音声データのビットレートが劇的に上がったりしない限りは32bitで済みそうな気がする。
Avatar
lovee 13-Dec-17 02:25 AM
TODO: Remove rationales. は具体的に何を指しているのか… 🤔
Avatar
koher 13-Dec-17 02:27 AM
誰かと思ったら @lovee さんのアイコンが変わってた・・・
Avatar
lovee 13-Dec-17 02:28 AM
いつまでも勉強会のスライドで版権イラスト載せるのはまずいと思って… 😇
それでちょうど冬コミに本出すのに表紙イラストをココナラで頼んだからそれをアイコンにすることに
🙂 4
Avatar
koher 15-Dec-17 07:40 AM
Java で intdouble に暗黙の型変換されてて、 double c = a / b;ab が Android の API のコールで int が返される)の精度が落ちてしまっている事例が社内で発覚した。やっぱり数値間ですら暗黙の型変換を許さない Swift の方向性は正しかったんだ〜😂 (edited)
😭 4
Avatar
omochimetaru 15-Dec-17 07:55 AM
そのバグ何度も踏んできたから / 書く時はトラウマが呼び起こされてミスしない体になった
Swiftだと c の型を書かずに let にしていた結果、 Int のまま以降の行まで型推論が伝搬していって、
渡すところで Double で明示的変換するんだけど、除算はずっとまえに書いてるからやっぱり気づけ無い
みたいなパターンもあって
/ 書く時は周囲に型をだいぶ明示的に書きたくなる
let t = 1 / 2 ... なんか処理 ... TimeInterval(t)
↑コンパイル通るし 0 の TimeInterval ができちゃう
Avatar
Biacco42 15-Dec-17 08:00 AM
オーバーロードが終端だと全く気づくチャンスがないのか…
Avatar
omochimetaru 15-Dec-17 08:00 AM
そうなんだよねえ
言語によっては / は常に実数除算への昇格で、 整数のあまり切り捨て除算は別の演算子になってることもあるね。
Avatar
koher 15-Dec-17 08:11 AM
Python はそうだね。
Avatar
omochimetaru 15-Dec-17 08:11 AM
pythonがそうでしたっけ
Avatar
koher 15-Dec-17 08:12 AM
$ python Python 3.6.1 (default, Apr 19 2017, 14:30:24) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.41)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 3 / 2 1.5 >>> 3 // 2 1
Avatar
omochimetaru 15-Dec-17 08:13 AM
おお。 // があった気がしてたけどpythonか。
pythonはコメントが # だからいけるのかw
Avatar
norio_nomura 17-Dec-17 11:33 AM
JSONEncoderconvertToSnakeCase myURLPropertymy_url_propertyに変換するのだけれど、JSONDecoderconvertFromSnakeCasemy_url_propertymyUrlPropertyへ変換するので、デコードに失敗する。 https://bugs.swift.org/browse/SR-6629
Avatar
tarunon 17-Dec-17 11:34 AM
きびしそう
Avatar
omochimetaru 17-Dec-17 11:35 AM
あれ?
プロパティ名のほうは固定だからどちらでも生じるのは myURLProperty -> my_url_property の変換かとおもってた
プロパティが myURLProperty, JSON上では my_url_property って関係性は静的に固定できてると
Avatar
norio_nomura 17-Dec-17 11:37 AM
convertFromSnakeCaseの実装がまずい。既存CodingKeysstringValuelowercasedとJSONのキーから_を削除した文字列を比較して、一致するCodingKeysメンバを決定しないといけない。 (edited)
Avatar
omochimetaru 17-Dec-17 11:39 AM
CodingKeys の stringValue から、 encoder側の convertToSnakeCase と同じ変換をかけてから
そのキーで JSON のバリューを読めば、ストレートな処理になりませんか?
KeyedContainer にいったん変換する過程で情報が失われちゃう?
Avatar
norio_nomura 17-Dec-17 11:40 AM
ああ、そっちの方が良いかも。
やっぱりStringに汎用のsnake_casedプロパティとかあった方が良さそう。
Avatar
norio_nomura 19-Dec-17 03:46 AM
CodingKeys の stringValue から、 encoder側の convertToSnakeCase と同じ変換をかけてから そのキーで JSON のバリューを読めば、ストレートな処理になりませんか?
今の実装のconvertFromSnakeCaseが色々な表記ゆれをサポートしてるせいで、その方法で上位互換にするのは無理かも。
(edited)
Avatar
tarunon 19-Dec-17 03:48 AM
表記ゆれは中でサポートせずに外で指定する形にしないと解決でき無さそう
Avatar
omochimetaru 19-Dec-17 03:49 AM
ウウム・・・
Avatar
norio_nomura 19-Dec-17 03:54 AM
YAMLDecoderで試しに実装してみた。 https://github.com/jpsim/Yams/pull/92
#84 This uses different algorithm on KeyDecodingStrategy from apple/swift#12779 that exprimenting to fix SR-6629.
#84 This uses different algorithm on KeyDecodingStrategy from apple/swift#12779 that exprimenting to fix SR-6629.
Avatar
omochimetaru 19-Dec-17 03:57 AM
「CodingKeysのString から JSONでのキー表現への変換」をする関数を EncoderとDecoderに渡せれば(つまり、convertToSnakeCase などの モードの custom クロージャ版)、1:1対応は全部いけそう。
今のJSONDecoderは同時に一つのプログラムで、1つのプロパティにたいして複数の文字列表現を受け付けられるわけだけど
個人的にはその需要は無いと思う。
それって読み込もうとしてるJSONがそもそも同じ値を表現するために2種類以上のキー表現をバラけて使うということなんで
そんなん起こらんと思う・・・
もし起こったらシコシコ init(from decoder) 書けば良いし。
Avatar
norio_nomura 19-Dec-17 04:00 AM
そうなんだよね。今のJSONDecoderの実装は無駄に凝りすぎだと思う。
Avatar
omochimetaru 19-Dec-17 04:01 AM
同じオブジェクトを表すJSONの形式が複数ある場合は考えられるけど、それはデコーダで対応するんじゃなくて、そのそれぞれのJSONに対応した型を定義して、その先で変換したほうが良い
そうじゃないと絶対ぐちゃぐちゃになる
まあFoundation/JSONEncoder/JSONDecoder は、困った事があったら自作や他人の実装使えばいっか、って思ってます
Avatar
rikusouda 19-Dec-17 09:33 AM
objcで定義されたenumに対してswitchをSwiftで書いたとき、どれにもマッチしないときには最初のcaseにマッチしたように動いているようですが、これってSwiftの言語仕様で定義された動作ですかね?
typedef NS_ENUM(NSInteger, State) { StateHoge = 0, StateHuga = 1, };
Swift:
let state = State(rawValue: 100)! switch state { case .hoge: print("hoge") // ★↑これが実行される case .huga: print("huga") }
Avatar
koher 19-Dec-17 09:34 AM
State(rawValue: 100)nil にならないところが Swift 的に変で、そこのチェックが漏れてるのかもしれませんね。
Avatar
rikusouda 19-Dec-17 09:37 AM
https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html objcのenumを非定義の値で初期化できるのは、Swift Language Fixesの3つ目を見た感じ、意図した動作のようではあるのです。
Imported NS_ENUM types with undocumented values, such as UIViewAnimationCurve, can now be converted from their raw integer values using the init(rawValue:) initializer without being reset to nil. Code that used unsafeBitCast as a workaround for this issue can be written to use the raw value initializer.
Avatar
koher 19-Dec-17 09:41 AM
@rikusouda state.rawValue100 ですか? 0 ですか?
Avatar
rikusouda 19-Dec-17 09:52 AM
100です (実際には少し違うコードでやっていますがenumに定義していない値がrawValueで保持されています)
Avatar
koher 19-Dec-17 09:53 AM
予想ですが、そういう状況で switch で何が起こるかは仕様として決まってないんじゃないかと思います。
Avatar
rintaro 19-Dec-17 09:54 AM
バグでいいんじゃないかと。 enums.h
#include <Foundation/Foundation.h> typedef NS_ENUM(NSInteger, State) { StateHoge = 0, StateHuga = 1, };
main.swift
public func foo(state: State) -> Int { switch state { case .hoge: return 1 case .huga: return 2 } } let s = State(rawValue: 100)! print(foo(state: s))
実行
$ swift -import-objc-header enums.h main.swift 1 $ swift -O -import-objc-header enums.h main.swift 2
(edited)
-O 有無で結果が違うのはちょっと受け入れられない。
Avatar
koher 19-Dec-17 09:56 AM
未定義動作なんでしょうね。。。
未定義というか、バグで不定の動作をしてしまっている。
Avatar
rintaro 19-Dec-17 10:00 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
rikusouda 19-Dec-17 10:05 AM
当面はなんらか回避する必要がありそうですね。。。
Avatar
rikusouda 19-Dec-17 10:21 AM
ありがとうございます🙏
Avatar
hiragram 20-Dec-17 04:45 PM
Numeric って ExpressibleByIntegerLiteral を継承してるのに Int のイニシャライザに Numeric を受けるやつないのか…?
IntにできないNumericってあるのか?
Avatar
norio_nomura 20-Dec-17 11:33 PM
// Integer literals are limited to 2048 bits.
というコメントが。 https://github.com/apple/swift/blob/0cf1b52452f56b3bbdf2f2305cc10fef42bdff8b/stdlib/public/core/Policy.swift#L99
(edited)
swift - The Swift Programming Language
Avatar
koher 21-Dec-17 01:06 AM
@hiragram 整数から生成できることと整数に変換できることは別じゃないですか?
たとえば、複素数は整数から生成できるけど整数には変換できない。
Avatar
hiragram 22-Dec-17 01:53 AM
レス遅れてすみません。複素数の例でだいぶ納得しました。
"整数にできる" (=確実にIntにできる) みたいな意味のNumeric関連のプロトコルってなさそうですよね
Avatar
koher 22-Dec-17 01:56 AM
NumericExpressibleByIntegerLiteral なのはよくわかんないですよね。行列とかで使えなくなっちゃいますし。
まあ、 number じゃないから numeric じゃないのかな?
Avatar
hiragram 22-Dec-17 01:58 AM
行列って "数" 扱いなんですか?数学的に
"数値" か
Avatar
koher 22-Dec-17 01:59 AM
数が実数を指すなら数じゃないですね・・・
Numeric よりも、群・環・体 https://qiita.com/taketo1024/items/733e0ecf12da359db729 みたいなプロトコルほしいですよね。
どうも、佐野です。前回の記事 で整数は「環」、有理数・実数・複素数は「体」であるという話をしました。今回は「群・環・体...
👍 1
Avatar
hiragram 22-Dec-17 02:00 AM
プリミティブな"数値" ではないんじゃないかなーというイメージがありました
Avatar
koher 22-Dec-17 02:00 AM
もしくは、 Addable, Multipliable とかの方がプログラミング的には使い勝手がいいのかも?
Avatar
t.ae 22-Dec-17 02:02 AM
割り算で変な別れ方になってるしそっちのほうがいっそ良いかも
現状だとBinaryIntegerFloatingPointで分けて実装してるのが一本化できる
Avatar
koher 22-Dec-17 02:27 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
koher 22-Dec-17 07:50 AM
Swift の String って subscript { set } ができないからイミュータブルなのかと思ってたけど違った。
1> var s = "ABC" s: String = "ABC" 2> s.removeLast() $R0: Character = { _representation = smallUTF16 { smallUTF16 = 67 } } 3> print(s) AB
Avatar
Avatar
koher 22-Dec-17 08:03 AM
うん、そっちも見つけた。
subscript { set } ができないのは、 Character が何バイトか定まらないから O(1) で実現できないからか。
Avatar
omochimetaru 22-Dec-17 08:04 AM
あ、ああ、 subscript { set } ができない って事を知っていたんですね、そっちを知らなかった。
Avatar
koher 22-Dec-17 08:05 AM
EasyText みたいな方式にしないと O(1) の subscript { set } を実現できない。
append とか removeLast とかって MutableCollection についてるのかと思ってたけど違った。で、 subscript { set } がないから StringMutableCollection じゃないだろう→ appendremoveLast もないだろうと思って勘違いしてた。 https://developer.apple.com/documentation/swift/mutablecollection (edited)
確かに末尾に追加・削除なら String でも平均 O(1) で実現できて問題ないのか。 (edited)
Avatar
d_date 22-Dec-17 11:55 AM
faillthroughで遊んでたけど、実際Swiftにおいてどんなユースケースがあるんだろう。
Avatar
Kishikawa Katsumi 22-Dec-17 12:08 PM
faillthrough のユースケース?それとも^のコードですか?
Avatar
d_date 22-Dec-17 12:10 PM
ユースケースです。上のコードが想定された挙動だということは理解できたんですけど、実際failthrough書くことあんまりないなと思ってまして。 (edited)
Avatar
Kishikawa Katsumi 22-Dec-17 12:11 PM
failthroughを使うことはあまりないと思いますよ。だからこれまでのC言語系の文法だとデフォルトがfailthroughだったのをやめたわけで。
func tokenize(source: String) -> [Token] { let state = State(input: source) for character in state.input { switch state.mode { case .plain: switch character { case "'": state.mode = .symbol case "\"": state.mode = .string case "\n": state.mode = .newline state.storage = "" case "(", ")", ":": state.tokens.append(Token(type: .token, value: String(character))) case " ": break default: state.mode = .token state.storage = String(character) }
👍 1
^ こういうのとか使うかもしれないけど、caseにカンマで区切ってもかけるから、結局書かない。
滅多に使わないので下手に使ってfailthroughを見落として下に抜ける方が罠っぽくなるし。 (edited)
と思います。
Avatar
tarunon 22-Dec-17 12:15 PM
昔ってカンマ区切り書けなかったんでしたっけ?カンマ区切りあるから本当に出番少ないよなぁという印象です
Avatar
Kishikawa Katsumi 22-Dec-17 12:16 PM
Swift 2あたりでデフォルトで下に抜けなくなってfallthroughが入ったんじゃなかったでしたっけ? (edited)
Avatar
tarunon 22-Dec-17 12:17 PM
そこはさいしょからだったような🤔
Avatar
Kishikawa Katsumi 22-Dec-17 12:17 PM
最初からっぽいですね。
Avatar
d_date 22-Dec-17 12:18 PM
確か最初からだったはず。さっきはった画像みたいな挙動してほしくないなー。
Avatar
Kishikawa Katsumi 22-Dec-17 12:18 PM
Swiftにfallthroughいらないんじゃないというのは同意です。
Avatar
d_date 22-Dec-17 12:19 PM
ですね。
Avatar
koher 26-Dec-17 03:24 PM
原因不明だけどなんかスターが急に40-50くらい増えた🤔 https://github.com/koher/EasyImagy
EasyImagy - Makes it easy to process images in Swift
🌟 7
Avatar
Kuniwak 27-Dec-17 03:05 AM
以前アドバイスをいただいたMVVMのリファクタリングの記事を公開できました!ありがとうございました!https://qiita.com/Kuniwak/items/015cddcf37e854713a2e
この記事は、RxSwift が提供する公式のサンプルである RxExample で行き詰まった方向けに、実践的な対処方法を紹介します。具体的には RxExample にある MVVM (Model-View-ViewModel) を真...
👏 4
Avatar
omochimetaru 27-Dec-17 04:45 AM
This PR changes post increment (and decrement) to pre increment for simple increment case. I think that it is helpful for other new contributors to avoid small fix such like #13572 (comment) . In t...
😅 1
Avatar
koher 27-Dec-17 05:10 AM
2 分w
Avatar
koher 28-Dec-17 07:11 AM
⭐ 150 になった🙂 https://github.com/koher/EasyImagy
EasyImagy - Makes it easy to process images in Swift
⭐ 2
これまで CI サボってたけど、スター増えてるからビビって Travis の設定した。 https://github.com/koher/EasyImagy/blob/dev-0.4.0/.travis.yml
EasyImagy - Makes it easy to process images in Swift
gysb - Generate your swifty boilerplate
AnyObjectConvertible - Convert your own struct/enum to AnyObject easily.
Himotoki - A type-safe JSON decoding library purely written in Swift
APIKit - Type-safe networking abstraction layer that associates request type with response type.
Stencil is a simple and powerful template language for Swift.
Avatar
rinsuki 28-Dec-17 07:18 AM
Swift on the Server continues to evolve. Since the launch of Swift@IBM in 2015, we’ve seen a lot of changes in the Swift language. As part of our collaboration with the server-side Swift community, we created tools like Swift Sandbox, enabling hundreds of thousands of developers to experiment with Swift on Linux. We also built the Swift …
😱 2
Avatar
omochimetaru 28-Dec-17 07:20 AM
Today, we announce the deprecation of Swift Sandbox and Swift Package Catalog, to take place in January of 2018.
Avatar
koher 28-Dec-17 07:21 AM
えー、 Swift Sandbox 便利なのに・・・。
Apple 公式で Swift のオンライン実行環境作って欲しい。
Avatar
omochimetaru 28-Dec-17 07:24 AM
wandbox使うと良いかも https://wandbox.org
Avatar
ukitaka 28-Dec-17 07:30 AM
Swiftにもこれ欲しいですね〜〜 https://play.rust-lang.org/
Avatar
koher 28-Dec-17 07:30 AM
Try Kotlin right in the browser.
↓に色んな言語のオンライン実行環境のリストが。 https://qiita.com/koher/items/e4835bd429b88809ab33
この数年で null 安全 [^99] は一気に浸透したように思います。ざっと思いつくだけでも、次のプログラミング言語で null 安全 が採用されました。 | 言語 | null 安全 に関する公式の記述 | ...
Avatar
omochimetaru 28-Dec-17 07:31 AM
golangなんかトップページw
Avatar
koher 28-Dec-17 07:32 AM
Ceylon https://try.ceylon-lang.org/ や Crystal https://play.crystal-lang.org/ ですらあるのに・・・。
Avatar
mono 10-Jan-18 02:28 AM
Self hosted and embeddable Swift Playground solution with a third-party module support baked in.
公式ではないですが。
Avatar
omochimetaru 10-Jan-18 02:29 AM
#swift でも出てましたね 助かる
👀 1
Avatar
hiragram 10-Jan-18 09:00 AM
@tarunon RxBlockingをproductionで使うのってどうおもう
Avatar
tarunon 10-Jan-18 09:00 AM
場合によっては必要でしょ
Avatar
hiragram 10-Jan-18 09:00 AM
全部リアクティブプロパティにしておいて局所的に同期的に取りたいならRxBlocking使えばええやんの思考になってるんだけどさ
Avatar
tarunon 10-Jan-18 09:00 AM
できるだけ使わなくて済むようにするけどどうしようもないこともある
Avatar
hiragram 10-Jan-18 09:00 AM
でもreadmeには本番で使うなよって書いてるしなーみたいな
Avatar
tarunon 10-Jan-18 09:01 AM
あー
まあそういう場合はBehaviorRelayが適切かね
Avatar
hiragram 10-Jan-18 09:01 AM
使うのをためらう理由、readmeに使うなって書いてある〜以外ないんだけど
BehaviorRelayってバージョンいくつから使えるんだっけ
Avatar
tarunon 10-Jan-18 09:01 AM
4かな
Avatar
omochimetaru 10-Jan-18 09:01 AM
Rxとか関係なくって非同期処理を同期的に待つのはバッドプラクティスだと思うけど。
Avatar
tarunon 10-Jan-18 09:01 AM
それはそうだけど、同しようもない場合があるにはあって
Avatar
omochimetaru 10-Jan-18 09:02 AM
その間メインスレッドがフリーズしてUIが固まっちゃうよ。
Avatar
hiragram 10-Jan-18 09:02 AM
でもデリゲートメソッドなどで同期的にreturnしないといけないとことかあるやん
同期的に取れるはずのところで取れなかったらエラーで落ちていいとおもってる
Avatar
tarunon 10-Jan-18 09:02 AM
結局それNSRunLoop使ったりしてたことを考えるとうーんという
インジケータくるくる回って操作できないのと画面フリーズは本質的には同じやし、そういう体験は極力なくしていくのがベネ
Avatar
omochimetaru 10-Jan-18 09:02 AM
同期的に取れるはずのところで取れなかったらエラーで落ちていいとおもってる
ん?これは
ちょっと話しの前提が違う気がする
それだったら、常に 即座に正常系が進むか、 即座にエラークラッシュするかだから、OKだと思う。
Avatar
hiragram 10-Jan-18 09:03 AM
うん
Avatar
omochimetaru 10-Jan-18 09:03 AM
ブロッキングしてない。
Avatar
hiragram 10-Jan-18 09:03 AM
IUOみたいなもんだと思ってる
あー。
Avatar
tarunon 10-Jan-18 09:03 AM
うん、それはBehaviorRelayやね
Avatar
hiragram 10-Jan-18 09:03 AM
Observableから値を同期的に取り出す手段としてRxBlockingをプロダクションに導入することの是非、を聞きたかったのが最初。
Avatar
tarunon 10-Jan-18 09:04 AM
そもRelayじゃなくてSubjectでもいいけど
Avatar
hiragram 10-Jan-18 09:04 AM
値が無かったら待つのではなくて普通に落ちてほしい
Avatar
tarunon 10-Jan-18 09:04 AM
じゃあBlockingの出番はない
でー、初期値なしだとBehaviorSubjectは取り回しが悪いので、ReplaySubject(1)がおすすめかな
Avatar
omochimetaru 10-Jan-18 09:04 AM
ReactiveEmitter - Lightweight observable in Swift seen from EventEmitter in JavaScript.
Avatar
hiragram 10-Jan-18 09:05 AM
RxSwift4系全然キャッチアップできてないのでせねばな〜
Avatar
omochimetaru 10-Jan-18 09:05 AM
型としてはTだけど read before write がクラッシュする。 IUO と同じやね。 (edited)
RxSwiftには BehaviorRelayとBehaviorSubjectとReplaySubject(1) があるのか・・・
Avatar
tarunon 10-Jan-18 09:05 AM
初期値適当に入れるのは嘘だから避けたいよねという話、ありますあります
Avatar
hiragram 10-Jan-18 09:06 AM
できればsubjectでも無い方が嬉しいんだよな
Avatar
tarunon 10-Jan-18 09:06 AM
えっと
Avatar
hiragram 10-Jan-18 09:06 AM
onNext()を勝手に手で呼べないでほしい
Avatar
tarunon 10-Jan-18 09:06 AM
Subject(Errorある)とRelay(Errorない)があって
Avatar
Kuniwak 10-Jan-18 09:06 AM
そうすると、Signal です?
Avatar
tarunon 10-Jan-18 09:06 AM
SubjectはPublish, Behavior, Replayがある。RelayはReplay以外がある。
そうするともう一個自分で型をラップして作るのが良いと思うよ
Avatar
Kuniwak 10-Jan-18 09:07 AM
自分で言っておいてなんですが、Signal だと利用範囲が少なすぎますね・・・
Avatar
hiragram 10-Jan-18 09:07 AM
SignalってRACのSignalですか?
Rx4でそういうのがはいったのかな
Avatar
Kuniwak 10-Jan-18 09:07 AM
いえ、RxSwift の Signal です
Avatar
tarunon 10-Jan-18 09:07 AM
RxSwiftのSignalはReplay, Error無しのHot川 (edited)
Avatar
hiragram 10-Jan-18 09:08 AM
Replayナシだと同期的に取れないすな
Avatar
Kuniwak 10-Jan-18 09:08 AM
あと Driver と同じくメインスレッドです
Avatar
tarunon 10-Jan-18 09:08 AM
結局やりたいこと事態は安全なオレオレVariableを作りたいぜって話っぽくって
そのためにBlocking注入は些か乱暴な気がするな
Avatar
Kuniwak 10-Jan-18 09:09 AM
なるほど、パッと聞くと BehaviorRelay ですけど、read only にしたいのであれば tarunon さんのおっしゃる通りラップするのが適当に思いますね
Avatar
tarunon 10-Jan-18 09:09 AM
あー
もしかしてオペレーターで適当に加工した値も同期的に取りたい、とかそういう意図もあるのか?
Avatar
hiragram 10-Jan-18 09:10 AM
それはないな
なんというか
Avatar
tarunon 10-Jan-18 09:10 AM
一応、DriverとBehaviorRelayを使って丁寧に組めば出来るね。
Avatar
hiragram 10-Jan-18 09:10 AM
ふむ
いいからとりあえずRxSwiftを3から4に上げろという話だな
Avatar
tarunon 10-Jan-18 09:11 AM
それはそうやね
てかそれSwift3やろw
Swift4つかお?
Avatar
Kuniwak 10-Jan-18 09:11 AM
RxSwift3 でも Variable のラッパーでもいい気がするのですが、そうでもないです?
Avatar
omochimetaru 10-Jan-18 09:12 AM
PublishSubject, BehaviorSubject, ReplaySubject, PublishRelay, BehaviorRelay Publish: onで入れるとすぐ流れる、現在値無し Behavior: .valueに入れるとすぐ流れる、現在値として1個残る、valueのgetterで同期的に取れる、初期値が必要 Replay: 内部的に現在値として1個残る、getterインターフェースは無い、初期値は不要 Subject: next | error | compl が流れる Relay: next しか流れない これであってる?
Avatar
tarunon 10-Jan-18 09:12 AM
Replay:  はキャッシュする最大数を初期値で与えることが出来る
Avatar
omochimetaru 10-Jan-18 09:13 AM
で、BehaviorRelay だと良さそうだけど駄目なのは、 - 初期値が必要だけど初期値を使っちゃうシナリオはバグにしたい - 型的に on による書き込み口も見えちゃう
の2点が ひらりの不満点?
ああ、ReplayのNはN=1のときだけ考えた。
Avatar
hiragram 10-Jan-18 09:13 AM
あいや
そもBehaviorRelayはぼくまだそれがある世界に居ないので不満などは無感情
onが見えるのは嫌
Avatar
omochimetaru 10-Jan-18 09:14 AM
で、ヒラリが考えてるのは、 onが見えるのが嫌だから、Subjectの型じゃなくて、Observableで外に出したいけど、 そうするとgetterインターフェースも消えちゃうから、 見かけ上subscribeすることになってしまうが、 そのsubscribeの実態は即座に現在値を返す「はず」 をコードで表明したい
Avatar
Kuniwak 10-Jan-18 09:14 AM
あ〜〜〜、それは思ったことありますね
Avatar
omochimetaru 10-Jan-18 09:14 AM
あってる? @hiragram
BehaviorRelay が無い世界の目線も考慮するのややこしいぞ・・・
Avatar
hiragram 10-Jan-18 09:15 AM
即座に返すことをコードで表明したい、というよりはIUOっぽく扱いたいなーくらいのライトな願望
Avatar
omochimetaru 10-Jan-18 09:16 AM
protocol ValueProducer { associatedtype Value var value: Value { get } }
↑これ自作してさ
BehaviorRelayをextensionでconformanceさせて AnyValueProducer<T> で返せば?
protocol ValueProducer : ObservableConvertible { associatedtype Value var value: Value { get } }
こうかな。(ObservableConvertibleを足した)
Avatar
hiragram 10-Jan-18 09:18 AM
RxBlockingのほうがなんか乱暴というのはわかって、まあやろうとしてることは乱暴(ストリームから同期的にその瞬間値を得ようとしている)だから適切に乱暴に見えるRxBlockingでいいんじゃないかなーみたいな気分に一周回ってなってきた
Avatar
tarunon 10-Jan-18 09:18 AM
BehaviorRelayを使ってラップすると冗長なので、ラップするならBehaviorSubjectをラップしたほうが良いかな
Avatar
hiragram 10-Jan-18 09:19 AM
サーバーサイドSwiftのプロジェクトにはRxBlockingガンガン使いまくってて結構感触いいのでアプリ側もこれ入れちゃっていいんじゃねみたいなのが最初の発言のきっかけです
Avatar
omochimetaru 10-Jan-18 09:20 AM
RxBlockingを入れちゃうと
あれってextensionで同期的に現在値取るメソッドとか生やすよね
同期的でない普通のストリームにうっかり使っちゃうバグを差し込む恐れが無い?
Avatar
hiragram 10-Jan-18 09:20 AM
Observable.just(1).toBlocking().first
toBlockingで明示的に変換しないと同期的に取れない
それもこみでうっかり使っちゃうバグはまああるかも
Avatar
omochimetaru 10-Jan-18 09:21 AM
あ、あとさ、
Avatar
hiragram 10-Jan-18 09:21 AM
やったこと無いけどタイムアウト設定できた気がするので同期的に取れなかったらerrorにするみたいなことできるはずなんだよね
Avatar
omochimetaru 10-Jan-18 09:21 AM
toBlockingの内部ってNSRunLoop回してくれんのかな
Avatar
hiragram 10-Jan-18 09:21 AM
というと?
Avatar
tarunon 10-Jan-18 09:21 AM
タイムアウトはある
Avatar
omochimetaru 10-Jan-18 09:21 AM
接続されてるタスクがメインスレッドに投入する非同期処理の場合にデッドロックしそう (edited)
Avatar
hiragram 10-Jan-18 09:22 AM
ハマったこと無いから明確に調べたことなかったけどありそう
Avatar
tarunon 10-Jan-18 09:22 AM
ちゃんと読んでないけど名前見る感じ大丈夫ぽ
Avatar
omochimetaru 10-Jan-18 09:22 AM
iOS/MacOSの裏技で同期待ちをRunLoop回しながらやるとそれが消化できるけどエグいスタックトレースになる技がある
Avatar
hiragram 10-Jan-18 09:23 AM
ポ〜
Avatar
omochimetaru 10-Jan-18 09:23 AM
RunLoop回しながらタイムアウト付きか、なるほど・・・
じゃあ今言ったパターンのデッドロックの心配は無さそう。
それもこみでうっかり使っちゃうバグはまああるかも
型付けしておけば同期的に取れないものに使っちゃう恐れは無くせる。
Avatar
hiragram 10-Jan-18 09:24 AM
後続の処理はブロックするけどスレッド全体をブロックすることはないってことでおk?
Avatar
omochimetaru 10-Jan-18 09:25 AM
根っこがBehaviorSubjectとかならその型情報がどんどん伝搬してくる感じ。 あ、でも、mapとかしてたら無理だな。
Avatar
tarunon 10-Jan-18 09:25 AM
そこは高階型がないからね
高階型あってもできないわすまん
Avatar
Kuniwak 10-Jan-18 09:25 AM
確かあれって実行された時の RunLoop にしか作用しなかった気がします
Avatar
omochimetaru 10-Jan-18 09:25 AM
mapしたところでObservableに降格しちゃう
@Kuniwak 違うRunLoopはそもそも回り続けてるから大丈夫?
RunLoop A から wait して A を回しながらもそのタスクが RunLoop B 上のタスクを同期的に待つ、
Avatar
Kuniwak 10-Jan-18 09:26 AM
だと思います。スレッドごとにRunLoopが一つあったと思うので、それのいずれかが止まるという認識でした。ただ、あの辺りまとまったドキュメントがなくてはっきりと断言できないです
Avatar
omochimetaru 10-Jan-18 09:26 AM
みたいな相互同期のケースとかで死ぬのかもしれん
Avatar
hiragram 10-Jan-18 09:26 AM
Observableに降格しちゃうはそうで、なので型で縛るというよりは見た目も込みで乱暴なことをここでしているんだぞという主張をしてほしいのほうが願いとしては強いかも
Avatar
omochimetaru 10-Jan-18 09:26 AM
スレッドごとにRunLoopが一つあったと思うので
そこはそうですね
Avatar
hiragram 10-Jan-18 09:27 AM
try!で落とすのかtry?でデフォルト値にフォールバックするのかはそのへんの局所の都合に任せたい感じ
Avatar
omochimetaru 10-Jan-18 09:27 AM
Observableに降格しちゃうはそうで、
うーむまあそうだよねえ
Avatar
hiragram 10-Jan-18 09:27 AM
BehaviorRelayとか上手に駆使してスマートなコードに見えちゃうほうが困るかも
Avatar
omochimetaru 10-Jan-18 09:28 AM
スマートというかシンプルに見えると思ったけど降格があるので駄目だな
Avatar
Kuniwak 10-Jan-18 09:28 AM
その辺り、SharingStrategy みたいに Observable と別物にするとなると実装範囲がやばくて死にますよね (edited)
Avatar
tarunon 10-Jan-18 09:28 AM
Operator全部自分で生やす事になる
Avatar
omochimetaru 10-Jan-18 09:28 AM
そこは高階型がないからね 高階型あってもできないわすまん
高階型があれば map とかを自身の型を返すように定義して一発でいけんのか?
(edited)
Avatar
tarunon 10-Jan-18 09:29 AM
イケる気がしたけどBehaviorRelayはObserver側もあるので
MapはContraMapとのセットでないといけなくなるから色々破綻する
Avatar
omochimetaru 10-Jan-18 09:29 AM
あー、そういうあれか
それについては同期的に返せる方の型にいったん変換しないと駄目かもね
@tarunon SubjectとRelayで思ったんだけど
その話って、Subject<T, Error> になってて、 Never が bottom type なら、 Relay は Subject<T, Never> で表せるっていう @inamiy さんが言ってるやつかな
👀 1
で、 Observable<T, Error, Sync> で Sync = Async | Sync なら
Avatar
tarunon 10-Jan-18 09:33 AM
いや、RelayとSubjectはCompleteの有無でも性質が異なるので
Avatar
omochimetaru 10-Jan-18 09:33 AM
いまいった、同期的に取れるか、っていう情報も型パラで統合できる?
extenstion でSync == Sync なら .first が生えるようにする。 (edited)
Completeの有無
じゃあそれも必要になるな
Avatar
tarunon 10-Jan-18 09:34 AM
そもそもそのレベルで性質が違うものを型パラに統合する事の意義は…という (edited)
Avatar
omochimetaru 10-Jan-18 09:34 AM
それだけだと使いにくいけどデフォルト型パラが言語機能にあれば見た目は隠せるんよな
Avatar
tarunon 10-Jan-18 09:35 AM
あー
Avatar
omochimetaru 10-Jan-18 09:35 AM
統合する事の意義
そうすれば 「実装範囲がやばくて死」を回避できる
Avatar
tarunon 10-Jan-18 09:35 AM
デフォルト型パラがあれば現実的な実装になるのかな
Avatar
omochimetaru 10-Jan-18 09:35 AM
共通の部分は共通で、 map してても、「同期的に結果が取れる川」って性質は型パラで渡していける
Avatar
Kuniwak 10-Jan-18 09:36 AM
確かにそれあるとすごい嬉しいですね
Avatar
tarunon 10-Jan-18 09:36 AM
それが可能なら、そもそもSharedSequenceとObservableの統合も出来るんじゃないかしら
Avatar
Kuniwak 10-Jan-18 09:36 AM
だと思います
Avatar
omochimetaru 10-Jan-18 09:36 AM
(まあ気持ちは懐疑的です・・・)
Completableの有無はあれか、ストリームが有限である保証の有無って感じか。
来ないやつは無限抽象。
Avatar
Kuniwak 10-Jan-18 09:38 AM
Completable まで型パラメータにすると、決定不能なパターンがある気がします
Avatar
tarunon 10-Jan-18 09:38 AM
それ昔考えたんだけど
Avatar
Kuniwak 10-Jan-18 09:38 AM
Not Completable から take すると Completable になるかどうか問題みたいなニュアンスです
Avatar
tarunon 10-Jan-18 09:39 AM
それはthrowsの有無、catchErrorで.errorを返したかどうかとか含め
Avatar
omochimetaru 10-Jan-18 09:39 AM
RxSwiftってSingleもあるよね、1個なやつ、だからCompletableがあるかどうかというより個数に関する型パラになるのかな。
Avatar
tarunon 10-Jan-18 09:39 AM
色々発生するので全部カバーする必要があります
Completable、Maybeもあるよ
Avatar
omochimetaru 10-Jan-18 09:39 AM
SingleがfilterでMaybeになるのはビビった
Avatar
hiragram 10-Jan-18 09:39 AM
え❗
そうなの
Avatar
Kuniwak 10-Jan-18 09:39 AM
賢いですね
Avatar
tarunon 10-Jan-18 09:39 AM
そりゃそうでしょ
Avatar
hiragram 10-Jan-18 09:40 AM
へー
Avatar
omochimetaru 10-Jan-18 09:40 AM
1だからfilterすると1か0になる。
オーバーロードしてあって、ファントムタイプで・・・
Avatar
tarunon 10-Jan-18 09:40 AM
その辺全部カバーして全てが型で保証されて
まあその結果、コンパイル時間が莫大になるのは想像に難くない
Avatar
hiragram 10-Jan-18 09:40 AM
SingleをflatMapでCompletableにするみたいなのできないのはなんでなん
Avatar
tarunon 10-Jan-18 09:41 AM
出来ないんだっけ
Avatar
hiragram 10-Jan-18 09:41 AM
直接はできないはず
SingleのflatMapはSingleを返さないといけなかった
Avatar
tarunon 10-Jan-18 09:42 AM
Maybe返したらMaybe、Completabale返したらCompletableになって良い気はするが
議論あったっけ?この辺カバーしないといけない範囲が尋常じゃないので
触られていない可能性もあるよ
Avatar
hiragram 10-Jan-18 09:42 AM
いつもSingleをasObservableしてflatmapの中でCompletableをasObservableしてその後ろでasCompletableしている
無駄だな〜と思いながら
Avatar
omochimetaru 10-Jan-18 09:43 AM
www
Avatar
tarunon 10-Jan-18 09:43 AM
いやてか
Single→asObservable→flatMap to Never type→asCompletableでよくない
flatMapの中にCompletableはいらなさそう
Avatar
hiragram 10-Jan-18 09:43 AM
あ、まあ
completableはどっかから持ってきたりする。
Avatar
tarunon 10-Jan-18 09:44 AM
そういうことね
議論はIssueにあるかもしれない。flatMapに関してはゆるい方向にいけるはずだから
Single -> Single, Maybe, Completable Maybe -> Maybe, Completable Completable (flatMapはない) になると思う (edited)
Avatar
hiragram 10-Jan-18 09:45 AM
そうだね
Avatar
hironytic 10-Jan-18 09:45 AM
⚠️ If you don't have something to report in the following format, it will probably be easier and faster to ask in the slack channel first. ⚠⚠️ Please take you time to fill in the fields below. If...
Avatar
tarunon 10-Jan-18 09:46 AM
andThen使えって書いてありますね
Avatar
omochimetaru 10-Jan-18 09:46 AM
これっぽい
Avatar
hiragram 10-Jan-18 09:46 AM
andThen❗
Avatar
hironytic 10-Jan-18 09:46 AM
それ、最終的にこのIssueになったはず。 https://github.com/ReactiveX/RxSwift/issues/1248 (edited)
Short description of the issue: Some transforming and combining operators needs to be added to PrimitiveSequence, and some should be removed because they have no effects on some traits, such as Fla...
Avatar
omochimetaru 10-Jan-18 09:48 AM
andThenは T が受けられないからちょっと違う?
Avatar
hiragram 10-Jan-18 09:49 AM
そうね
単に順番に実行するだけならできるけど、上流のnextを引数にCompletableを作るみたいなのはflatMapでしかできなそう。
Avatar
tarunon 10-Jan-18 09:51 AM
頻出するならとりあえずオレオレFlatMap作ったほうが絶対いいよ
こっちはこっちで議論しなきゃいけないにしても
Avatar
hironytic 10-Jan-18 09:52 AM
あれ結局まだないのかな。。。
Avatar
hiragram 10-Jan-18 09:53 AM
オレオレflatMap了解
Avatar
tarunon 10-Jan-18 09:58 AM
MaybeのFlatMapでSingle返したらMaybeになるはずだ(はずだ)
じゃあ @hiragram 議論頑張って、Sinkから実装もチャレンジしてくださいb
あでも実態は普通のflatMapだからSinkはいらないか
Avatar
hiragram 10-Jan-18 10:23 AM
すげえ締め方されてた
Sinkわからないとなという気持ちはあったので宿題のつもりでやってみようかな
Avatar
norio_nomura 11-Jan-18 10:46 AM
@koher: もしかして Swift って HashDoS の脆弱性がある?
#if _runtime(_ObjC)でのStringhashValueはそもそも文字列全体を使わないはずです。
Avatar
norio_nomura 12-Jan-18 01:47 AM
「使わないはずです」ではなく「使いません」だった。
import Foundation let first32Char = repeatElement("f", count: 32) let middle32Char = repeatElement("m", count: 32) let last32Char = repeatElement("l", count: 32) let a = (first32Char + ["ab"] + middle32Char + ["ab"] + last32Char).joined() let b = (first32Char + ["bc"] + middle32Char + ["bc"] + last32Char).joined() a == b // false // Foundation a.hash // -4528083392938427260 b.hash // -4528083392938427260 // Swift.Hashable a.hashValue // -8957072229412966235 b.hashValue // -8957072229412966235
Avatar
omochimetaru 12-Jan-18 01:48 AM
ほえ〜〜〜〜
Avatar
norio_nomura 12-Jan-18 01:49 AM
Linuxでもhashは同じ。
Avatar
omochimetaru 12-Jan-18 01:49 AM
まあ確かにHashの要件自体は満たす・・・
Avatar
norio_nomura 12-Jan-18 01:49 AM
そう。
Avatar
tarunon 12-Jan-18 01:49 AM
ムズムズするw
Avatar
omochimetaru 12-Jan-18 01:49 AM
面白い・・・😟
Avatar
norio_nomura 12-Jan-18 01:51 AM
SwiftLintでhashをファイル変更検知に使ってバグってたことがあった時に調べた。 https://github.com/realm/SwiftLint/issues/1184#issuecomment-274744331
We have just updated to 0.16 in our codebase and I'm working through the new rules. First up it's sorted_imports. For this, we have a build phase which runs ${PODS_ROOT}/SwiftLint/swiftlint as per ...
😰 1
Avatar
omochimetaru 12-Jan-18 01:52 AM
なるほど・・・
まあ全長で使っていたとしても、辞書のキーに使う事を想定したハッシュと、処理時間をかけてもよく散らばらせる暗号論的ハッシュ関数では、後者を使う方が設計上よろしいでしょうね
Avatar
hiragram 12-Jan-18 07:03 AM
enum HogeType: Int { case aaa = 1 case bbb case ccc }
↑ この書き方嫌いなんですけど、意外と賛同してくれる人少ないんだろうかと思ってるんですがどうですか
enum HogeType: Int { case aaa = 1 case bbb = 2 case ccc = 3 }
IntのrawValueつけるなら全case明示してほしい。
Avatar
omochimetaru 12-Jan-18 07:04 AM
C++だと上の書き方よくやる
Swiftでもできるの知らんかった。
Avatar
tarunon 12-Jan-18 07:04 AM
case並び替えとか発生したときにデータ壊したくないから全部書きたい
Avatar
hiragram 12-Jan-18 07:04 AM
そうそう
Avatar
tarunon 12-Jan-18 07:04 AM
欠番とかもあり得るし
Avatar
omochimetaru 12-Jan-18 07:05 AM
整数値が外部APIにつながってるとそうだよね
Avatar
hiragram 12-Jan-18 07:05 AM
caseの定義順って普通のプロパティの定義順と同じくらいどうでもいいものだと思うんだよね
Avatar
omochimetaru 12-Jan-18 07:05 AM
内部的な都合なら手書きだと重複する事故があるから自動列挙のほうがいい場合もありそう
Avatar
tarunon 12-Jan-18 07:05 AM
重複はコンパイルエラーにならなかったっけ?
Avatar
omochimetaru 12-Jan-18 07:06 AM
Avatar
hiragram 12-Jan-18 07:06 AM
内部的なやつなら普通にswitchとかパターンマッチ使えばいいケースしか無い気がする
Avatar
omochimetaru 12-Jan-18 07:06 AM
なるほど
Avatar
hiragram 12-Jan-18 07:06 AM
外に出すのに値が必要だからrawValueつける場合ばっかじゃないかな
Avatar
omochimetaru 12-Jan-18 07:06 AM
そんな気も
Avatar
hiragram 12-Jan-18 07:07 AM
重複は Raw value for enum case is not unique というエラーが出た
Avatar
tarunon 12-Jan-18 07:07 AM
Raw value for enum case is not uniqueって出るからオッケー
コンパイルエラー起こしたら始末書みたいなクソ現場じゃない限りは大丈夫ですね
Avatar
hiragram 12-Jan-18 07:07 AM
case一個消したらそれ以降全部ずれるし
Avatar
omochimetaru 12-Jan-18 07:07 AM
コンパイラ偉いなあ
Avatar
Kuniwak 12-Jan-18 07:08 AM
話逸れますが、= hoge を省略した場合って non-frozen との整合性どうなるんでしょう
Avatar
hiragram 12-Jan-18 07:08 AM
同じ理由でenumのhashValueを使ってたらレビュー通さないとおもう
Avatar
omochimetaru 12-Jan-18 07:09 AM
fragile enum周りのevolution全然追ってない
Avatar
hiragram 12-Jan-18 07:10 AM
おなじく
Avatar
Kuniwak 12-Jan-18 07:12 AM
SE-0192 シュッと見た感じ言及はなさそう…?
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 12-Jan-18 07:12 AM
jrose氏なのか
Avatar
Kuniwak 12-Jan-18 07:13 AM
読むと苦肉の策感高い Proposal です
Avatar
omochimetaru 12-Jan-18 07:13 AM
めちゃくちゃながいw
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
レビュー入りしたほうだとexhaustiveっぽい
Status: Active Review (December 19, 2017...January 3, 2018)
終わってた
Avatar
Kuniwak 12-Jan-18 07:17 AM
やはり言及がないですね… 😰
Avatar
hiragram 12-Jan-18 05:08 PM
class A { weak lazy var hoge: B? = nil } class B {}
これなんか変なコンパイルエラーなった
Playground execution failed: error: cannot convert return expression of type 'B?' to return type 'B?' error: cannot assign value of type 'B?' to type 'B??' error: cannot assign value of type 'B?' to type 'B??'
lazy なくすとエラーなくなるんだけど、 lazy ってその変数の型には影響しないよね
Avatar
bannzai 12-Jan-18 05:11 PM
weak + lazy ? が参照持てないし使えないのかなと思ったり
エラーメッセージ がよくわかりませんが。。
Avatar
hiragram 12-Jan-18 05:12 PM
lazyって参照持てないんだっけ
Avatar
bannzai 12-Jan-18 05:13 PM
いや、weak が です
Avatar
hiragram 12-Jan-18 05:13 PM
retain countは増えないけど、参照は参照ですよね
Avatar
bannzai 12-Jan-18 05:14 PM
ああ、言葉が悪かったです retain count が増えないのが問題なのかなと思いました ってうまく説明できそうな気がしたが感覚でしかわかってないな。。。
Avatar
hiragram 12-Jan-18 05:15 PM
lazyがあると cannot assign value of type 'B?' to type 'B??' で、lazyが無いとそのエラーが消えるということは、lazyのあるなしでそのプロパティの型が実は変わっているようなきがする
Avatar
bannzai 12-Jan-18 05:17 PM
コンパイル通したいってわけではなくて、 型がかわっているかどうか知りたいって感じか
Avatar
hiragram 12-Jan-18 05:17 PM
あいや普通にコンパイルは通って然るべきコードなのではと思っています
weakとlazy、別に互いに干渉するようなものじゃないと思うんだけどな
Avatar
bannzai 12-Jan-18 05:18 PM
class A { weak lazy var hoge: B? = B() } class B {}
でもこれはこれですぐ解放されるので あまり通って欲しくもない気がする
Avatar
hiragram 12-Jan-18 05:20 PM
それはコードがhogeが具体的にどのように与えられるかによるのでコンパイラの責務では無いような。
そのコードも、僕が貼ったコードも型のルールの上でコンパイル通らない理屈は無いと思うんですよね
Avatar
bannzai 12-Jan-18 05:21 PM
class A { weak lazy var hoge: B = B() } class B {}
nil になるならまだいいんですけど これだとなおわからない気がする
Avatar
hiragram 12-Jan-18 05:21 PM
weakはOptionalじゃないとダメですよ
Avatar
bannzai 12-Jan-18 05:21 PM
あ、確かに
Avatar
hiragram 12-Jan-18 05:21 PM
それは別にlazy関係ないはず
Avatar
bannzai 12-Jan-18 05:22 PM
ですね
Avatar
hiragram 12-Jan-18 05:26 PM
To demonstrate this problem, I made a vanilla Cocoa project. Here is the AppDelegate.swift: import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { weak lazy var
SOあった。
Avatar
bannzai 12-Jan-18 05:26 PM
あれ、Swift4からって最後 nil になっちゃうんですね
class A { lazy var hoge: B! = B() } class B {} let a = A() a.hoge a.hoge = nil a.hoge
あー、じゃあ、僕の会話していた時の頭の中が古かった 前まではもう一度初期化されていたはずだから weak + lazy ??? ってなってました
Avatar
hiragram 12-Jan-18 05:27 PM
もう一度初期化ってどういうことですか
Avatar
bannzai 12-Jan-18 05:28 PM
Swift4
let a = A() a.hoge // B a.hoge = nil // nil a.hoge // nil
Swift3
let a = A() a.hoge // B a.hoge = nil // nil a.hoge // B
こういうこと
Avatar
hiragram 12-Jan-18 05:28 PM
nilの時アクセスしたらってこと?
Avatar
bannzai 12-Jan-18 05:28 PM
ですです
Avatar
hiragram 12-Jan-18 05:28 PM
えー
Swift3そうだったっけ…。
Avatar
bannzai 12-Jan-18 05:30 PM
3.2でビルドするとなるかな。。。 3.1まではそう書いて動いていた気がするが
Avatar
hiragram 12-Jan-18 05:32 PM
3.2では最後の行はnilですね
Avatar
bannzai 12-Jan-18 05:32 PM
あれま
Avatar
hiragram 12-Jan-18 05:32 PM
lazyは最初にアクセスするまで初期化を遅延させるものなので値がnilかどうかなどは関係ないような
もやもやするので3.1以前で確認してもらいたいですね
3.1ってXcodeいくつが必要なんだっけ…
Avatar
bannzai 12-Jan-18 05:35 PM
これだから正解ってわけじゃないんですが https://image.slidesharecdn.com/cocoakansailazyvar-160404013001/95/lazy-var-cocoakansai-cswift-57-638.jpg?cb=1459743921 熊谷さんが試してくれていた
Avatar
hiragram 12-Jan-18 05:36 PM
これいつの資料だろ。
Avatar
bannzai 12-Jan-18 05:36 PM
が、結構前だな 2016/4
Avatar
hiragram 12-Jan-18 05:36 PM
Swift3からIUOの扱いが変わったのでそれまではそんな動きしてたのかなあ
2 系かな?
Avatar
bannzai 12-Jan-18 05:38 PM
この時はそうですね まあ 3.1 かどうかは置いておいてこういう時代があったんですよね
lazyは最初にアクセスするまで初期化を遅延させるものなので値がnilかどうかなどは関係ないような
これはそうあって欲しくて、今の仕様の方がわかりやすいですね
(edited)
Avatar
tarunon 12-Jan-18 05:40 PM
召喚された
Avatar
hiragram 12-Jan-18 05:40 PM
まってたぜ
Avatar
tarunon 12-Jan-18 05:40 PM
weakとlazy組み合わせた場合かー
Avatar
bannzai 12-Jan-18 05:40 PM
bug report はあった
Resolved
Avatar
hiragram 12-Jan-18 05:41 PM
@tarunon lazyのあるなしでエラーメッセージによるとhogeが B?? と解釈されてるかどうかが変わっているきがするんだけどどう
そもエラーがどのファイルのどの行って示せていないので、なんかがおかしいのは確定だと思うんだけどな
class A { weak lazy var hoge: B? = { return B??.none }() } class B {}
Playground execution failed: error: cannot convert return expression of type 'B?' to return type 'B?' error: MyPlayground.playground:4:30: error: cannot convert value of type 'B??' to specified type 'B?' weak lazy var hoge: B? = { ^ error: cannot assign value of type 'B?' to type 'B??' error: cannot assign value of type 'B?' to type 'B??'
もっとポンコツっぽくなった
Avatar
tarunon 12-Jan-18 05:44 PM
いやそれは、B??はB?には変換できないでしょ
Avatar
hiragram 12-Jan-18 05:44 PM
エラーメッセージおかしくね
Avatar
tarunon 12-Jan-18 05:45 PM
行数指定されてるエラーはまとも、それ以外は前と一緒かな
Avatar
hiragram 12-Jan-18 05:45 PM
結局内部的(?)にはhogeはB?なのかB??なのかどっちになってるんだろう
Avatar
tarunon 12-Jan-18 05:46 PM
ひらり的には何がやりたいの
1. これを使って解決したい問題があった 2. 興味本位
Avatar
hiragram 12-Jan-18 05:47 PM
さいしょ1だったけどいま2
factory initをこのまえ知って使ってみたくなって、「ViewModelを返すクロージャを引数に受けるViewControllerのイニシャライザ」を作ったんだけど
let articlesVC = ArticlesViewController.init { return ArticlesViewModel.init(dataProvider: ArticlesAPIDataProvider.init()) }
本番のコードなんで文脈なくてすまんやけど
Avatar
tarunon 12-Jan-18 05:49 PM
lazyは内部的にOptionalを使っているコンピューテッドプロパティであると解釈するなら、
weakと組み合わせたときにぶっ壊れてそれがチラ見できるようになったということかもしれないね
Avatar
hiragram 12-Jan-18 05:50 PM
VMのイニシャライザにVCを渡したくなったけど循環を回避するためにweakにして、更にarticlesVCの初期化処理の中でarticlesVCを使えないのでlazyにして初期値を uninitialized() にすればいけんちゃうみたいな
uninitialized() は中身fatalErrorの func uninitialized<T>() -> T
Avatar
tarunon 12-Jan-18 05:50 PM
うーん
weakにした時点でOptionalなんだから初期値nilでよくって
lazyを使う必要がなくならないか?
Avatar
hiragram 12-Jan-18 05:51 PM
vcの参照は必須にしたいんよね
Avatar
tarunon 12-Jan-18 05:51 PM
じゃあIUOで
Avatar
hiragram 12-Jan-18 05:51 PM
get before set は落としたい
やっぱそうなるよね〜〜〜〜〜〜〜
Avatar
tarunon 12-Jan-18 05:52 PM
あとはー、そうだねぇ
Avatar
hiragram 12-Jan-18 05:52 PM
何かIUO使わなくていいなら使いたくないので、lazyで行けるっしょと思ったら行けなくて悲しかったってかんじ
Avatar
tarunon 12-Jan-18 05:53 PM
class VC {} class VM { private weak var _vc: VC? = nil var vc: VC { get { return _vc ?? undefined() } set { _vc = vc } } }
ほれ
これでもIUO無しでやりたいことはできるゾイ (edited)
Avatar
hiragram 12-Jan-18 05:54 PM
別の変数に置いとけばまあ、ってかんじか
まあ ってかんじだな
Avatar
tarunon 12-Jan-18 05:54 PM
自前Lazy
これを表現するLazyWeak型を作ればスッとできないかな
Avatar
hiragram 12-Jan-18 05:54 PM
ぱっとみ大仰なのでIUOのほうがやりたいことがわかって良いかもしれない
おっLazyWeak
Avatar
tarunon 12-Jan-18 05:56 PM
class LazyWeak<T> { private weak var _value: T? = nil private func undefined() -> T { fatalError() } var value: T { get { return _value ?? undefined() } set { _value = value } } } class VM { var vc = LazyWeak<VC>() }
こういうイメッジ
使いやすいかはしらん
Avatar
hiragram 12-Jan-18 05:56 PM
クラッシュするのはweakってよりunownedっぽいね
Avatar
tarunon 12-Jan-18 05:57 PM
unownedならそもlazy使えるんじゃね
unownedってプロパティに使えたっけ
オッダメだw
同じErrorすね
Avatar
hiragram 12-Jan-18 05:59 PM
class A { unowned lazy var hoge: B = B() } class B {}
Playground execution failed: error: cannot convert return expression of type 'B' to return type 'B' error: MyPlayground.playground:4:32: error: cannot convert value of type 'B' to specified type 'B' unowned lazy var hoge: B = B() ^~~ error: cannot assign value of type 'B' to type 'B?' error: cannot assign value of type 'B' to type 'B?'
hoge: B! だとなんか違う怒られする
Avatar
tarunon 12-Jan-18 05:59 PM
それはそもそもクラスじゃなくなるから
Avatar
hiragram 12-Jan-18 06:00 PM
あ、そか
なる
Avatar
tarunon 12-Jan-18 06:00 PM
unownedはクラス型、weakはOptional<クラス>
Avatar
hiragram 12-Jan-18 06:00 PM
unownedはIUOじゃないの
クラス!にならん?
Avatar
tarunon 12-Jan-18 06:00 PM
ならんくね?
Avatar
hiragram 12-Jan-18 06:01 PM
アレ?
Avatar
tarunon 12-Jan-18 06:02 PM
アクセス失敗後の世界は無いはずなのだからIUOになる意味がないと思う
Avatar
hiragram 12-Jan-18 06:02 PM
それってSwiftのエラー的には何になるん
unownedあんまり意識してつかったことないからてっきりweakはOptionalでunownedはIUOになるもんかと思ってたけど
Avatar
tarunon 12-Jan-18 06:03 PM
SIGABRT (edited)
Avatar
hiragram 12-Jan-18 06:04 PM
うわー
ホントだ
型そのまんまだ
class A { var block: (() -> ()) = {} func hoge(block: @escaping (() -> ())) { self.block = block block() } } class VC { func viewDidLoad() { let a = A.init() a.hoge { [unowned self] in print(self) } } } VC.init().viewDidLoad()
__lldb_expr_98.VC
↑printの結果
weakだとOptional<~~~~>になる
Avatar
tarunon 12-Jan-18 06:06 PM
ケース的には、weak + IUOがベター、IUOがどうしても嫌ならLazyUnowned型作るのが良いと思った
(もっと個人的な思想の話をするとVCとVMの循環参照そのものをやめたほうが良い気がするけど)
Avatar
hiragram 12-Jan-18 06:07 PM
その思想はわいもそうなんだけど
UITableViewCellに乗っけてるAdmobのバナーViewがUIViewControllerのインスタンスを要求してきて、そのセルはVMのRxDataSourcesで作られているみたいなアレで仕方ないかなあみたいな
アレです
Avatar
tarunon 12-Jan-18 06:08 PM
Cellに渡すデータだけをViewModelで作るようにしたら
あー
Avatar
hiragram 12-Jan-18 06:09 PM
セルに渡すデータにVCも含まれているのよ
Avatar
tarunon 12-Jan-18 06:09 PM
configureCellの在処
Avatar
hiragram 12-Jan-18 06:10 PM
configureCellの実態どこにおいてる?
Avatar
tarunon 12-Jan-18 06:10 PM
個人だと例のごとく丸っとアレだけど
Avatar
hiragram 12-Jan-18 06:10 PM
どっかのバージョンからdataSourceのイニシャライザに渡すようになってからふ〜んこいつはVMに置くべきなんやなあとおもってVMに書いてるけど
使ってないんだっけお兄さん
Avatar
tarunon 12-Jan-18 06:10 PM
型合わせゲーム解決したらセルが生えてくる例のアレだす
Avatar
hiragram 12-Jan-18 06:11 PM
でた
全然覚えてないけど
Avatar
tarunon 12-Jan-18 06:11 PM
Admobうんこやん、そいつTableViewの外に置けないの?
Avatar
hiragram 12-Jan-18 06:12 PM
多分VCの一番下端に貼っつけるのが想定ユースケースなんだろうなってのはドキュメントからすごい伝わってきた
けどそれ嫌いなのでテーブルの中に紛れさせたい
Avatar
tarunon 12-Jan-18 06:12 PM
スクロールしたら怒られると思うよ
Avatar
hiragram 12-Jan-18 06:12 PM
怒られるのかなあ
うげー
Avatar
tarunon 12-Jan-18 06:13 PM
ガイドラインにスクロールで領域外に隠すな💢みたいなのは見た記憶がある
えっとね
AdViewController作ってそれはコンテナVCにして、Childに綺麗な世界を作ることを強くおすすめします
広告sdkは大体良くないからね、世界を分けよう
Avatar
hiragram 12-Jan-18 06:14 PM
他の画面はもうそうなってんのよね
うぐー
Avatar
omochimetaru 12-Jan-18 06:14 PM
おきた
Avatar
hiragram 12-Jan-18 06:14 PM
おは
Avatar
tarunon 12-Jan-18 06:15 PM
なんかTableに混ぜる系の広告sdkはそれ専用のapi群があって(使い勝手がよいわけではない)みたいなイメッジ
Avatar
omochimetaru 12-Jan-18 06:15 PM
lazyってSILレベルでは存在しない気がする
computed propの実装になってそう
Avatar
tarunon 12-Jan-18 06:16 PM
広告導入して循環参照追加することになりましたとか、敗北もいいところなのでsdkを床に叩きつけたいなw
決闘だ
Avatar
omochimetaru 12-Jan-18 06:16 PM
そこで一回りオプショナルがつくのと
weakの辻褄合わせにバグがあるのかと
Avatar
hiragram 12-Jan-18 06:16 PM
ネイティブ広告出せるイマドキインターフェースもってる広告SDKおしえて
Avatar
tarunon 12-Jan-18 06:16 PM
ダヨネ
そんなものは…
広告sdkは残念ながら
Avatar
hiragram 12-Jan-18 06:17 PM
とりあえずFirebaseで計測できるってからAdmob入れてるけど
Avatar
tarunon 12-Jan-18 06:28 PM
広告sdkは、「兎に角仕様を変更しない」がKPIのひとつになるので、今時インターフェースってのは難しいと思う (edited)
Avatar
hiragram 12-Jan-18 06:29 PM
かなしい
Avatar
Kuniwak 14-Jan-18 04:03 AM
例の Delegate でゴニョゴニョ実験していたやつの結果が出ました: https://github.com/Kuniwak/DelegateKit
DelegateKit - Operators and Utilities for Delegates
👏 1
まず、Delegate を protocol SomethingDelegate: class {} という形式で宣言できなくなりました。いちいち Type Erasure 書くのを避けるための苦渋の選択ですが、最悪です
DelegateKit - Operators and Utilities for Delegates
Avatar
omochimetaru 15-Jan-18 01:37 AM
Delegateのオブジェクトへの弱参照+呼び出されるメソッド群 っていう構造を、associted valueのあるenumとしてまとめて一つの型にして、デリゲートの通知を直接のオブジェクトとして取り扱うってアイデアは良さそうですね RxCocoaでUIButtonとかに .rx が 生えてるやつでできることを、それ単体だけ Rx 全部を導入しないで採用できないか、ってのがコアアイデアですかね?
Avatar
Kuniwak 15-Jan-18 01:50 AM
RxCocoaでUIButtonとかに .rx が 生えてるやつでできることを、それ単体だけ Rx 全部を導入しないで採用できないか、ってのがコアアイデアですかね?
はい、それを狙っています。
Rx の中でも一番有望だと思っていたのは throttle/debounce ですね。Delegate でも使いたいシーンは結構あるので…
Avatar
tarunon 15-Jan-18 03:05 AM
AnyDelegate無しでなんとかならないかな
Avatar
Kuniwak 15-Jan-18 04:46 AM
これ誕生の経緯が結構あるので説明長くなるんですよね。。。
class DelegateHolder { weak var delegate: SomethingDelegate? } let holder = DelegateHolder() // これは弱参照で持ってほしい。 holder.delegate = SomethingDelegateImpl() // これは強参照で持ってほしい。なぜなら、これを弱参照にすると map の戻り値の参照を誰も保持してないのですぐに回収されてしまうから。 holder.delegate = SomethingDelegateImpl() .map { a in a * 2 } // この差異を吸収するために、weak と strong の両方を持てるインターフェースを持つ必要があった。これを実現しているのが AnyDelegate。
Avatar
tarunon 15-Jan-18 04:59 AM
Rxだとその辺はDisposeBag側から参照持つ形で解決してますね。
Avatar
Kuniwak 15-Jan-18 05:03 AM
その方法も検討したのですが、これを導入すると Delegate の頃にはなかった subscription の概念が入ってしまうので避けたという経緯があります
UIKit などの Delegate のように、subscription は delegate プロパティへの代入で実現されるのを目指した形になりますね。その辺りは実装者の好みも入っています(weak が書けなくなるか、subscription を入れるかの二択のうち、前者を選択したので)。
Avatar
tarunon 15-Jan-18 05:05 AM
ふむ
Avatar
omochimetaru 16-Jan-18 08:01 AM
雑なエラー型ってどうしてます?絵文字投票可能にして聞いてみる。 - 1⃣ GenericError みたいな型を定義する - 2⃣ Error を定義する。言語仕様の方のやつと衝突しちゃうのでそっちを使う時は Swift.Error と完全名で記述する - 3⃣ NSError を使う - 4⃣ 絶対に雑なエラー型は作らない(ライブラリやそのクラスや関数に起因したエラー型を定義する) - 5⃣ その他 (edited)
1⃣ 5
4⃣ 3
2⃣ 1
僕はもともと[1]だけど微妙に思えてきて[2]に乗り換えたけどこれも面倒になってきて[3]を検討しているところ (edited)
Avatar
tarunon 16-Jan-18 08:03 AM
雑なError is
Avatar
omochimetaru 16-Jan-18 08:03 AM
とりあえずエラーメッセージをthrowしたくてとりあえずそれ以上詳細なパラメータはcatch側で必要ないようなやつ。
Avatar
tarunon 16-Jan-18 08:03 AM
オッ
Avatar
Kishikawa Katsumi 16-Jan-18 08:03 AM
ライブラリ名Errorみたいなやつですよね。
Avatar
tarunon 16-Jan-18 08:03 AM
その他かな
雑なエラーが発生するクラス.Errorを作る
Avatar
Kishikawa Katsumi 16-Jan-18 08:04 AM
CarthageErrorみたいな
Avatar
omochimetaru 16-Jan-18 08:04 AM
じゃあ[4]?
Avatar
tarunon 16-Jan-18 08:04 AM
4かこれw
Avatar
omochimetaru 16-Jan-18 08:04 AM
CarthageError は [1] かな〜
Avatar
tarunon 16-Jan-18 08:04 AM
なんだろう
Avatar
omochimetaru 16-Jan-18 08:04 AM
Carthage 自体がパッケージを作ると考えて Carthage.Error としていてパッケージの中では Error なのであれば [2]
@tarunon そうするといろんなクラスでその Class.Error 実装するのがめんどくさい コンストラクタ書いて :CustomStringConvertibleかいてdescripton書いて・・・
Avatar
tarunon 16-Jan-18 08:05 AM
protocol DescribedError: Error, CustomStringConvertible { }
こういうの用意してそれでマッチするようにしてる
Avatar
omochimetaru 16-Jan-18 08:05 AM
なるほど。
それって typealias DescribedError = Error & CustomStringConvertible とかでもいいのかな。
Avatar
tarunon 16-Jan-18 08:06 AM
ライブラリ外に投げる場合は雑なエラーではなく、ライブラリ.Errorなかなり具体性を持たせてラップして投げる必要があると思う
asキャスト使えるっけ?
Avatar
omochimetaru 16-Jan-18 08:06 AM
無理だね nominal でないから
Avatar
tarunon 16-Jan-18 08:06 AM
じゃあダメだ
Avatar
omochimetaru 16-Jan-18 08:07 AM
(すごい勢いで流れていってアンケートが死んだw
Avatar
tarunon 16-Jan-18 08:07 AM
使う時に enum Error: DescribedErrorって書きたいから
Avatar
omochimetaru 16-Jan-18 08:10 AM
extension String : Error {} func a() throws { throw "error message" } do { try a() } catch let e { print(e) // "error message\n" }
Avatar
tarunon 16-Jan-18 08:10 AM
それはやばい
Avatar
omochimetaru 16-Jan-18 08:10 AM
これできるのか・・・😅
Avatar
tarunon 16-Jan-18 08:11 AM
最悪でもRawRepresentableにしよう!
Avatar
omochimetaru 16-Jan-18 08:11 AM
悪魔召喚感
Avatar
tarunon 16-Jan-18 08:11 AM
使ってるの見たら 👮 する
Avatar
hiragram 18-Jan-18 03:24 AM
guard句に引っかかってelseの中を通って処理が終了したときになんかそれに気づける&&どこのguardで引っかかったかprintしてくれたりしたらうれしいなーみたいなことを思ったんですが
それはコンパイラに手を入れるしか無い?
Avatar
omochimetaru 18-Jan-18 03:25 AM
print書けばいい・・・?
Avatar
hiragram 18-Jan-18 03:25 AM
全部のguardに書くの現実的ではない
Avatar
omochimetaru 18-Jan-18 03:26 AM
全部のguardでそれやるのそもそも微妙じゃない?
必ずしもエラーケースとは限らないじゃん、正しく脱出することもあるから
拾いたくない普通にたくさんおきるguardでログが膨大に発生してしまう
Avatar
hiragram 18-Jan-18 03:26 AM
コンパイラのオプションかなんかでそのへんオンオフできたらいいなって
Avatar
omochimetaru 18-Jan-18 03:28 AM
自分の場合はブレークポイント貼ってだいたい解決してるなあ
似たような話で
guardの中でも特に異常系での脱出は
throw してるので
throw全部でブレークする設定ができるから
俺の場合はそれで拾えてる
それで駄目なケースはguardの中で、returnで脱出するケースだね
Avatar
hiragram 18-Jan-18 03:29 AM
そういうコードがいっぱいある
Avatar
omochimetaru 18-Jan-18 03:29 AM
それって普通のif文のフローも全部トレースしたいって言ってるのと同じ気がするけど・・・
それはコンパイラに手を入れるしか無い?
コンパイラに手を入れるアプローチだったら
guard文をSILに変換する時に
else本文の先頭の生成部で print を生成すればできそう
SwiftSyntaxが完成すれば、AST変換で実装するのもできそう
Avatar
hiragram 18-Jan-18 03:32 AM
guardでの異常脱出はthrowで、って結構目からウロコだったんだけどthrowsばっかになって辛いみたいなことないんすかね
Avatar
omochimetaru 18-Jan-18 03:32 AM
guard文の句構造は (guard キーワード、評価式部分、 elseキーワード、LBrace、制御部、RBrace)だから、制御部にprint文を注入するだけかな
それが異常ならthrowsで表現しといた方がうまくいくと思う
returnの場合は void関数で処理をスキップした場合と、 型があってデフォルト値に畳み込んだ場合だよね
Avatar
hiragram 18-Jan-18 03:33 AM
うん
throwするようにしてわかりやすくしても結局try?で握りつぶされまくる未来が見えるな
Avatar
omochimetaru 18-Jan-18 03:34 AM
それらのケースは仕事を呼び出し側に押し付けてるだけだからあんまり意味が無い
意図を表現するために skip 関数と makeDefault 関数 みたいなのを作っておいて、それを使ってコーディングするようにしておいて
skip関数とmakeDefault関数の中でprintするように書き換えれば
Swiftだけでその目的果たせそう
一般の return を全部捕まえるのは既存の方法では無理だと思う
Avatar
hiragram 18-Jan-18 03:36 AM
まあ新しくguardを書くときはそうなのかもしれん
Avatar
omochimetaru 18-Jan-18 03:36 AM
SwiftSyntaxでコード変換するのが良いんじゃないかなあ
現バージョンならguard文とかもいけるんじゃねえか 知らんけど
それだったら Swiftソースから Swiftソースへの加工だから
で、加工処理自体もSwiftで書けるから
ハードルは低いと思う
Avatar
hiragram 18-Jan-18 03:37 AM
今はもうそこそこそ大きくなってしまったコードベースの中でデータ不整合チックなことを検出するguardでお手軽returnしてなにもしないみたいな感じになっておりデバッグが大変つらいのでguardに引っかかりましたよ一覧のログがごっそりあってそこでおかしなのを探すみたいなアプローチができたら嬉しいのかなというアレでした
SwiftSyntaxしらべてみるか
Avatar
omochimetaru 18-Jan-18 03:38 AM
try! Swift is an immersive community gathering about Swift Language Best Practices, Application Development in Swift, Server-Side Swift, Open Source Swift, and the Swift Community taking place around the world in Tokyo, New York, and Bangalore.
トライスイフトで岸川さんが教えてくれるよ
Avatar
hiragram 18-Jan-18 03:38 AM
わいやったらこの不整合preconditionFailureで落とすぞみたいなのもしれっとreturnして何事もなかったかのようにアプリは生き続けて不具合のきっかけがどこかわからんみたいなのがある
😫 1
期待
Avatar
omochimetaru 18-Jan-18 03:38 AM
いつのまにか普通に import SwiftSyntax できるよになってたしハードル下がってきた (edited)
Avatar
Kishikawa Katsumi 18-Jan-18 03:39 AM
まあguard節のことは全然考えてなかったけど、そういうアスペクト指向みたいなものを実現するようなものを考えてます。
Avatar
omochimetaru 18-Jan-18 03:39 AM
わいやったらこの不整合preconditionFailureで落とすぞみたいなのもしれっとreturnして何事もなかったかのようにアプリは生き続けて不具合のきっかけがどこかわからんみたいなのがある
例外握りつぶしてて異常系のトレーサビリティーが死んでるやつだ
Avatar
hiragram 18-Jan-18 03:40 AM
そう
Avatar
omochimetaru 18-Jan-18 03:40 AM
そういうのはやっぱコード変換が良さそうだなあ
腐ってるソースファイル全部をバコッと変換して
実行すればいろいろわかる、みたいな。
コンパイラでやっちゃうと、正しくguardを使ってる場所も余計に捕まえちゃうから
そのフックをかける範囲をいろいろコントロールできたほうがデバッグしやすいから
Avatar
koher 18-Jan-18 03:45 AM
null safety や検査例外は本来いいものだけど、握りつぶすと最悪なことになる・・・。
Avatar
tarunon 18-Jan-18 04:04 AM
guard return警察するしか
地に足をつけて生きていくしかないのだ
Avatar
omochimetaru 18-Jan-18 04:04 AM
ヒラリが言ってるのは既存コードだから
Avatar
tarunon 18-Jan-18 04:05 AM
既存コードに警察権を行使しよう
つまりPRだな
Avatar
omochimetaru 18-Jan-18 04:05 AM
その作業めっちゃ時間かかるじゃんw
Avatar
tarunon 18-Jan-18 04:05 AM
やらないならやらないでそれは未来に問題を先送りしてるだけだから
Avatar
omochimetaru 18-Jan-18 04:05 AM
その時間を省略してとりあえず今でてるバグをつぶしたいという話でしょ
Avatar
tarunon 18-Jan-18 04:05 AM
どこかで解決しないと
Avatar
rintaro 18-Jan-18 04:10 AM
Kishikawa さんが SwiftSyntax やめて -dump-ast ににしてしまったので、チーム一同悲しんでおります 😇
😢 1
Avatar
Kishikawa Katsumi 18-Jan-18 04:11 AM
PowerAssertには型の情報が必要なんですよね😥
Avatar
rintaro 18-Jan-18 04:13 AM
ですよねー。まあ SwiftSyntax はまだ早いというのは分かります。
Avatar
Kishikawa Katsumi 18-Jan-18 04:13 AM
だいぶ色々なコードが動くようになったので、デモサイトを作りました。
👀 2
Avatar
omochimetaru 18-Jan-18 04:14 AM
XCTAssert(max(a, b) == c) | | | | | 7 4 7 | 12 false XCTAssert(a + b > c) | | | | | 4 | 7 | 12 11 false XCTAssert(john.isTeenager) | | | false Person(name: "John", age: 42) XCTAssert(mike.isTeenager && john.age < mike.age) | | | | | | | | | false | | 42 | | 13 | | | | Person(name: "Mike", age: 13) | | | false | | Person(name: "John", age: 42) | false Person(name: "Mike", age: 13)
お〜〜〜
Avatar
koher 18-Jan-18 04:14 AM
すごい・・・
Avatar
Kishikawa Katsumi 18-Jan-18 04:15 AM
仕組みはすぐできたんだけど明け方からずっとSSLにしたくてがんばってたけどなんか無理だった。
実際のCLIの方は
Avatar
koher 18-Jan-18 04:17 AM
これってこの前のオンライン Playground ですよね?
Avatar
Kishikawa Katsumi 18-Jan-18 04:17 AM
swift-power-assert xctest -Xxcodebuild test -workspace <workspacename> -scheme <schemeName> -sdk iphonesimulator -destination "name=iPhone X,OS=11.2"
こんな感じでxcodebuildやswift testの前にコマンドを足したらいい感じにラップするようになってます。
@koher そうです。
Avatar
koher 18-Jan-18 04:19 AM
EC2 か何かの上で動かしてるんですか?
Avatar
Kishikawa Katsumi 18-Jan-18 04:19 AM
DigitalOceanの一番安いやつです。
👀 2
とりあえず、動かす所まで試そうと思って昨日やってました。
Avatar
koher 18-Jan-18 04:20 AM
↓で Swift Sandbox を当てにしてたので悲しいことになってしまい、自分で環境作ろうかと思ってたところです😭 https://github.com/swift-quest/swift-quest/blob/master/print-and-arithmetic/first-step.md
Contribute to swift-quest development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 18-Jan-18 04:22 AM
OnlineSwiftPlaygroundは入出力を生のテキストを簡単なJSONでラップしてやりとりしていて、基本的にそのままswiftcに渡してるだけですね。
Avatar
koher 18-Jan-18 04:22 AM
sandbox 化とか、リソースの分離とかしてくれるんでしょうか?
Avatar
Kishikawa Katsumi 18-Jan-18 04:23 AM
Macで実行する場合は標準のサンドボックス機構を使うように書かれてるけどLinuxホストの場合は何もなし。
Avatar
koher 18-Jan-18 04:23 AM
なるほど・・・
Avatar
Kishikawa Katsumi 18-Jan-18 04:23 AM
なので、コマンドインジェクションがたぶん可能。
そこはDockerで実行するとかでいいんじゃないかと。
Avatar
koher 18-Jan-18 04:25 AM
そこまでするなら OnlineSwiftPlayground じゃなくてもいい気がしますねぇ・・・。
Avatar
Kishikawa Katsumi 18-Jan-18 04:26 AM
DockerfileもあるんでDocker build & runが一番簡単ですよ。
Avatar
koher 18-Jan-18 04:26 AM
そうなんですね。
Avatar
omochimetaru 18-Jan-18 04:27 AM
DockerにすればSwiftのバージョン切り替えとかも実現しやすそうですね
Avatar
Kishikawa Katsumi 18-Jan-18 04:27 AM
まあ仕組みは超簡単なのでフロントエンドが好きなら全然自分でも作れる。 (edited)
これに乗っかると、NodeやSwiftを修正して、docker build & runて感じだから、最初試すぶんには良いと思います。
Avatar
koher 18-Jan-18 04:29 AM
なるほど。ありがとうございます。
Avatar
Kishikawa Katsumi 21-Jan-18 12:25 AM
https://swift-power-assert.kishikawakatsumi.com/ 細かいところが気になったので作り直した。Nodeを使ったのでPure Swiftじゃなくなってしまった。
SSLにもした。
作ってみると、意外にオンラインのREPLをSwiftで作るのは難しくないということと、IBMの以外にもSwiftのREPLを提供しているところは結構あるんだなということがわかりました。
👌 1
Avatar
omochimetaru 21-Jan-18 12:58 AM
ワンドボックスすき
Avatar
Kishikawa Katsumi 21-Jan-18 12:58 AM
Swiftがあるとは全く思ってなかった。LLVMファミリだからだろうか。
Dockerがあるからマルチプラットフォームで動かすことは全然大変じゃないけど、MacとLinuxで同じコードではダメなことが結構あるのが大変ですね。
Avatar
omochimetaru 25-Jan-18 04:33 AM
You and I both want to be able to use fixed key sets, and you and I both think arbitrary string literals should be supported too. So please consider taking my position on this proposal—that it should be accepted in its current form and that we should later extend the feature to support fixed key sets in addition to ExpressibleByStringLiteral types. I really think SE-0195 could be an important step towards our goal.
クリスラトナー、 Chris_Lattner3 とかいう、めっちゃアカウント生成トラブった感じの名前になってるけどw
Avatar
Kishikawa Katsumi 25-Jan-18 04:34 AM
先に誰かが取っちゃったとかでもなさそうですね。
Avatar
rintaro 25-Jan-18 04:35 AM
多分、apple.com nondot.org google.com の3アカウントあるのだと思います。
Avatar
norio_nomura 25-Jan-18 04:35 AM
複数のメールアドレスでMLに投稿してそれらにユーザー名が自動生成されて、最初の投稿のメールアドレスを使えなくて変えられないのでは。 (edited)
Avatar
omochimetaru 25-Jan-18 04:36 AM
このアドレスは404なんだなあ。 https://forums.swift.org/u/Chris_Lattner2/summary
Avatar
norio_nomura 25-Jan-18 04:40 AM
アクティベートしないとユーザーページは現れないとか?
Avatar
omochimetaru 25-Jan-18 04:41 AM
「取ってあるけどまだ見えない」はありそうですね。
>複数のメールアドレスでMLに投稿してそれらにユーザー名が自動生成されて、最初の投稿のメールアドレスを使えなくて変えられないのでは。 ああなるほど
Avatar
koher 25-Jan-18 04:42 AM
おお、これ Proposal 化されてレビュー入りしてたのか。 Swift で機械学習できるようになるの楽しみだ。 https://github.com/apple/swift-evolution/blob/master/proposals/0195-dynamic-member-lookup.md (edited)
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 25-Jan-18 04:42 AM
はい、いまレビュー期間ですね
Avatar
koher 25-Jan-18 04:43 AM
まあ、この Proposal だけじゃ Python 連携までは長い道のりなのか?
Avatar
omochimetaru 25-Jan-18 04:44 AM
とりあえずこれだけあれば、あとはライブラリで結構いけるんじゃないですか?
Avatar
koher 25-Jan-18 04:44 AM
Python.framework 使ってた気がするけど、それが Python 2 じゃないかという心配も・・・。
Avatar
omochimetaru 25-Jan-18 04:45 AM
Python3.frameworkってないのかな?
importでどっちも使えそう。
Avatar
Avatar
omochimetaru 25-Jan-18 04:46 AM
そうですね、そっちがない間は関数呼び出しのところは冗長。
Avatar
norio_nomura 25-Jan-18 02:09 PM
Release_Notes_for_Xcode_9.3_beta.pdf より
## Known Issues in Xcode 9.3 beta ### Swift Compiler - Conditional conformances are unsupported when performing a dynamic cast (with is or as).
これってSwift 4.1リリースでも直らないんだよね?
(edited)
Avatar
tarunon 25-Jan-18 02:10 PM
CondconfはExistentialにcastできない?
Avatar
ikesyo 25-Jan-18 02:12 PM
それを理由に最初フラグ指定しないと使えやいようにしてましたね(今ではフラグなしで使えるようになったけど。
Avatar
norio_nomura 25-Jan-18 02:13 PM
exampleを引用
protocol P { } extension Int: P { } // Fully supported: Set unconditionally conforms to P extension Set: P { } // Not supported in dynamic casts: Array conforms to P // only when its element conforms to P extension Array: P where Element: P { } func castToP(_ value: Any) { if value is P { print("\(type(of: value)) conforms to P"); } else { print("\(type(of: value)) does not conform to P") } } castToP(Set([1, 2, 3])) // unconditional conformances // are supported: // prints "Set<Int> conforms to P castToP([1, 2, 3]) // unsupported conditional conformance: // incorrectly prints "Array<Int> does not // conform to P" castToP([3.141593, 2.71828]) // unsupported conditional conformance: // correctly prints "Array<Double> does not // conform to P"
(edited)
Avatar
ikesyo 25-Jan-18 02:18 PM
さすがに4.1では無理そう
Avatar
norio_nomura 25-Jan-18 02:18 PM
コードによっては、Conditional Conformanceを使った型を食わせるテストが必要になりそう。
Avatar
norio_nomura 27-Jan-18 03:04 AM
flatMapのdeprecationはSwift 4.1とSwift 3.3両方だから、4.0.xと3.2.x互換を維持する場合のcompactMap定義は
#if (!swift(>=4.1) && swift(>=4.0)) || !swift(>=3.3) extension Array { public func compactMap(_ transform: (Element) throws -> String?) rethrows -> [String] { return try flatMap(transform) } } …
みたいに書く必要があるのか。
(edited)
😵 1
Avatar
koher 27-Jan-18 08:29 AM
version という comparable なものを使っているのに、 3 系と 4 系で独立して deprecated とか微妙ですね☹ それならグラフ構造で表さないと・・・。
Avatar
norio_nomura 27-Jan-18 01:21 PM
ちょっと修正、#if (!swift(>=4.1) && swift(>=4.0)) || !swift(>=3.3)だった。
Avatar
Biacco42 29-Jan-18 10:18 AM
public protocol Po { func doHoge() } extension Po { public static func getDefaultInstance() -> Po { return DefaultPo() } } internal class DefaultPo: Po { func doHoge() {} } // let po = Po.getDefaultInstance() <- Compile error let po = DefaultPo.getDefaultInstance()
なのに今さら気づいた… Protocol は適合する対象であって型としては存在はしないんだなぁというのを実感した
Avatar
tarunon 29-Jan-18 10:21 AM
それもそうだし、Genericsで<X: Po>ってやってXにPoを入れようとすると実感できるぞ
Avatar
Biacco42 29-Jan-18 10:23 AM
なんかそこもスッとつながって、型としての実体がないから
func hoge(po: Po) // dame func hoge<X: Po>(po: X) // OK
なのも実感として納得がいった
(edited)
Avatar
tarunon 29-Jan-18 10:25 AM
Bugs覗くと兄貴達がGenericsのそれにキレてるのをよく見る
<X: class>で死ぬのが一番多くてな
Avatar
Biacco42 29-Jan-18 10:26 AM
いやでもこれ Protocol の実在性について納得するとすごく自然に感じるし、むしろ
Avatar
tarunon 29-Jan-18 10:27 AM
故にErasure作ろうね!っていう話を
するんだな
Avatar
Biacco42 29-Jan-18 10:27 AM
あー、<HogeProtocol: class> してしまうのはありそう
Avatar
tarunon 29-Jan-18 10:27 AM
AnyClassValueっていうオレオレType-erasureを作って解決するのが、一番賢いと思うのだけど
中々ね
😭 1
Avatar
omochimetaru 30-Jan-18 04:41 AM
Swiftでスクリプティングをするための基盤環境ツール、こんなのあるんですね。 https://github.com/JohnSundell/Marathon https://github.com/yonaskolb/mint
Marathon makes it easy to write, run and manage your Swift scripts 🏃
Mint - A package manager that installs and runs Swift command line tools
ついでに、定義ファイルをSwiftで書くmakeとかもあった。名前が酒で良い。 https://github.com/xcodeswift/sake
sake - A make-like build utility for Swift.
Avatar
t.ae 02-Feb-18 06:44 AM
assertpreconditionにクロージャ渡せたらループチェックとかかきやすくて良いんじゃないかと思うんですがどうですかね? もとの定義が@autoclosureなのでそれはずしたのをオーバーロードするだけで行けると思うんですが。
あとドキュメント読んでて気付いたんですがassertpreconditionは最適化によってconditionを評価しないだけで呼出し自体が消えるんじゃないみたいですね。 ずっと勘違いしてました。
Avatar
koher 02-Feb-18 06:59 AM
消えるかどうかは最適化に委ねられてて、消えてる可能性もあるという認識です。確認したことはないけど。
Avatar
omochimetaru 02-Feb-18 06:59 AM
@t.ae ループチェックって何?
Avatar
t.ae 02-Feb-18 07:00 AM
/// - Parameters: /// - condition: The condition to test. condition is not evaluated in /// -Ounchecked builds.
とあったのですが呼び出しが消えるのは別にされてるかもしれませんね。
@omochimetaru 配列の全要素チェックです
Avatar
koher 02-Feb-18 07:01 AM
@t.ae
In -Ounchecked builds, condition is not evaluated, but the optimizer may assume that it always evaluates to true. Failure to satisfy that assumption is a serious programming error.
Avatar
omochimetaru 02-Feb-18 07:01 AM
@t.ae ああ。
precondition(items.all { $0 >= 0 })
これでいいじゃん
Avatar
t.ae 02-Feb-18 07:02 AM
基本それで良いんですけど複雑だと可読性が悪いですし、 問題なさそうでもコンパイル時間が長かったりするので
Avatar
omochimetaru 02-Feb-18 07:02 AM
クロージャが渡せたら楽になる、というのがよくわからない
結局ここはBoolを返す式じゃないといかんので。
Avatar
t.ae 02-Feb-18 07:03 AM
mapやcontainsが絡んでいるとそれらを分解できませんよね? クロージャで渡すならそれらを別々に呼べる
Avatar
omochimetaru 02-Feb-18 07:03 AM
全然わからない・・・
Avatar
t.ae 02-Feb-18 07:03 AM
let a = [0, 2, 4, 6] assert({ // all even for e in a { guard e % 2 == 0 else { return false } } return true }())
Avatar
omochimetaru 02-Feb-18 07:03 AM
どういうコードが書けるような状態を想像しているかサンプルが見たい。
Avatar
koher 02-Feb-18 07:04 AM
最後の () を消したいってこと?
あとは trailing closure にできるか。
Avatar
t.ae 02-Feb-18 07:04 AM
そうですね。というかこれ書いて()の有無しか変わらないなと気付いたんですが
Avatar
omochimetaru 02-Feb-18 07:05 AM
まさにそう思うし、↑の例だったら、 func allEven(_ x: [Int]) -> Bool を定義しておけば assert(allEven(x)) で良いよ
複雑な式になった場合に、それがロジックとして展開されている状態は、別に何もわかりやすくなってなくて
関数名つけたほうがいいんちゃう
Avatar
t.ae 02-Feb-18 07:05 AM
チェック用の関数を別に用意しとくわけですね。たしかにそっちのほうが良い気がしてきました……
Avatar
omochimetaru 02-Feb-18 07:06 AM
まあ、本当にその関数でしか使わない概念のチェックなら名前切り出さない方が統治されてるのかもしれないけど、そのケースは { }() の形で書けばいいいと思う。
Avatar
rintaro 02-Feb-18 08:11 AM
お知らせ: CountableRange を無くすPRがマージされました https://github.com/apple/swift/pull/13342 (edited)
Based on groundwork by @natecook1000 Not yet ready for commit until we figure out the source compatibility/migration story. Tests are mostly fixed up, except for things like hard-coded mangled name...
🎊 2
Avatar
omochimetaru 02-Feb-18 08:11 AM
Avatar
tarunon 02-Feb-18 08:14 AM
スッキリしてる
Avatar
koher 02-Feb-18 08:20 AM
diff を検索した限りでは typealias CountableRange がなかったんですが、 4.1 でそれを突っ込むと結構大きめの破壊的変更になる気が。これは 5 で入る PR ですか?
まあ typealias でも破壊的か。オーバーロードとか死ぬし。 (edited)
Avatar
omochimetaru 02-Feb-18 08:21 AM
条件付きのtypealiasって書けるんでしたっけ
Avatar
tarunon 02-Feb-18 08:22 AM
書けるけど壊れたような
Avatar
rintaro 02-Feb-18 08:23 AM
この変更は4.1 には入らないと思います。 https://github.com/apple/swift-source-compat-suite/pull/131 実際 互換性問題出てますね。
apple/swift#13342 uses conditional conformance to make Range a Collection when its Bound is Strideable. For compatibility, CountableRange is still available as a type alias. There is one source com...
Avatar
omochimetaru 02-Feb-18 08:23 AM
swift-source-compat-suite こんなリポジトリあったっけ
Avatar
tarunon 02-Feb-18 08:23 AM
この間Optionalでなんかガチャガチャやった時に、条件付きtypealiasでぶっ壊した記憶があるんだけど
typealias O<X> = Optional<X> where X: Sequence O<String>.some("a") O<Int>.some(1) // Error
壊れなくなった可能性がある
Avatar
Kishikawa Katsumi 02-Feb-18 08:25 AM
Souce compat suiteはSwiftのアップデートでソースコードレベルの互換性が失われていないかどうかのテストに協力するプロジェクト。 https://swift.org/blog/swift-source-compatibility-test-suite/
We are pleased to announce the release of a new Swift source compatibility test suite as part of the effort to maintain source compatibility in future Swift releases.
👀 1
私も1つプロジェクトを登録してて、なんかあったら連絡が来る、はず。
Avatar
tarunon 02-Feb-18 08:25 AM
思い出した、Extensionが壊れるんだった
Avatar
omochimetaru 02-Feb-18 08:25 AM
APRIL 24, 2017
知らなかった
Avatar
tarunon 02-Feb-18 08:25 AM
typealias O<X> = Optional<X> where X: Sequence O<String>.some("a") //O<Int>.some(1) // Error extension O { func foo() { print("foo") } } Optional<Int>.some(1).foo() //????
Avatar
Kishikawa Katsumi 02-Feb-18 08:26 AM
登録するの簡単だからやっとくとSwiftプロジェクトの助けになるはず。
Pull Request Description KeychainAccess is a simple Swift wrapper for Keychain API that works on iOS, watchOS, tvOS and macOS. KeychainAccess framework being added here is licensed under MIT. Accep...
Avatar
omochimetaru 02-Feb-18 08:26 AM
そう言えばSwiftコアで最近CIが野良ライブラリの性能評価テストをやっとるなと思ったけどそういうのがあったんですねえ
@tarunon ほんとだ、壊れてる 作りかけ感あるね
Avatar
rintaro 02-Feb-18 08:28 AM
@Kishikawa Katsumi compat suite なんかあったら連絡きます?ソース互換性保つのがミッションで、何かあったらコンパイラ側を直すのが基本なので、連絡来ないとおもってました。 実際その運用で Jesse と JP がブチ切れてた件。 https://spec.fm/podcasts/swift-unwrapped/99551
The source compatibility suite has been useful in catching compatibility issues before official Swift releases are cut, but it leaves much to be desired especially around communication with project maintainers outside Apple.
Avatar
koher 02-Feb-18 08:28 AM
条件満たしてれば↓こんな感じで登録できるんですね。 https://github.com/apple/swift-source-compat-suite/pull/39/files
Pull Request Description KeychainAccess is a simple Swift wrapper for Keychain API that works on iOS, watchOS, tvOS and macOS. KeychainAccess framework being added here is licensed under MIT. Accep...
Avatar
Kishikawa Katsumi 02-Feb-18 08:29 AM
@rintaro 来てないけど、何かあったら連絡するって書いてあったから連絡来るもんだと思ってました。
書いてなかったかな。。。
Avatar
rintaro 02-Feb-18 08:31 AM
In the event that Swift introduces a change that breaks source compatibility with a project (e.g., a compiler bug fix that fixes wrong behavior in the compiler), project maintainers are expected to update their projects and submit a new pull request with the updated commit hash within two weeks of being notified.
https://github.com/apple/swift-source-compat-suite#maintaining-projects ありました。
swift-source-compat-suite - The infrastructure and project index comprising the Swift source compatibility suite.
Avatar
Kishikawa Katsumi 02-Feb-18 08:32 AM
そうそう、そこ。within two weeks of being notified.って書いてあるので、登録するときはメール見逃さないようにしないと、と思った記憶があります。
Avatar
Kuniwak 03-Feb-18 01:34 AM
なるほど、私も MirrorDiffKit 登録してみたいですね(頻繁に壊れるので)
Mirror, ほんとマイナーバージョン上がってもかなり壊れるのでつらいです
Avatar
Kishikawa Katsumi 03-Feb-18 01:35 AM
頻繁に壊れるプロジェクトははとても役立つのではないでしょうか。
ランタイムのエラーはともかく、ソースコードのBreaking Changeはバグだと言われてるので、Swiftが修正されるべきですよ。
Avatar
Kuniwak 03-Feb-18 01:36 AM
なるほど、要件満たしてるかどうかみてきます
Ensure the project builds successfully at a chosen commit against Swift 3.0 GM
って書いてあるんですが、これ今もこの条件なんでしょうか…
Avatar
Kishikawa Katsumi 03-Feb-18 01:37 AM
それはどうでしょうね。
Avatar
rintaro 13-Feb-18 02:30 AM
https://summerofcode.withgoogle.com/organizations/4739935060361216/ https://swift.org/project-ideas/ GSoC 通ったみたいです。興味ある学生の方は是非!
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
omochimetaru 13-Feb-18 02:32 AM
Google Summer of Code (GSoC) は2005年の5月から8月に初めて開催され、その後毎年行われているイベントで[1]、Googleが指定したフリーソフトウェアやオープンソースのプロジェクトでその夏の間に課題をクリアした数百人の学生に賞金を支払う制度である。参加資格は18歳以上の学生で、これを補完する Google Highly Open Participation Contest は18歳未満を対象としている。
Swift compiler integration with external tools Potential mentors Rintaro Ishizaki
Avatar
rintaro 13-Feb-18 02:33 AM
mentor まじか、って感じですよねぇ 😇
👀 1
昨日 #swift-2 で出てた libSyntax の今後も見えますね。
Avatar
norio_nomura 13-Feb-18 02:40 AM
おおw
## Swift compiler integration with external tools ## Integration of libSyntax with the rest of the compiler pipeline. ### Potential mentors Rintaro Ishizaki
(edited)
Avatar
Kishikawa Katsumi 13-Feb-18 03:37 AM
^ SNSでシェアするボタン無いのかな。。。
無さそう。自分でやろう。
Avatar
tarunon 13-Feb-18 04:03 AM
Google Highly Open Participation Contest
こっちはSwiftやってないんですか?
Avatar
rintaro 13-Feb-18 04:06 AM
そっち知らないです。検索したところ、2007から2008にかけてだけだったんじゃ無いかな。 https://en.wikipedia.org/wiki/Google_Highly_Open_Participation_Contest
The Google Highly Open Participation Contest was a contest run by Google during 2007-2008 aimed at high school students. The contest was designed to encourage high school students to participate in open source projects. It was succeeded by Google...
Avatar
tarunon 13-Feb-18 04:06 AM
今はもうないのか…
Avatar
omochimetaru 13-Feb-18 04:11 AM
@kateinoigakukun 君年齢足りないスゴイな
😱 1
Avatar
tarunon 13-Feb-18 04:13 AM
https://developers.google.com/open-source/gsoc/faq
What are the eligibility requirements for participation? ・You must be at least 18 years of age
😇 1
Avatar
kateinoigakukun 13-Feb-18 04:16 AM
数え年で19なので実はセーフ?
Avatar
tarunon 13-Feb-18 04:16 AM
もし本当に興味があってやりたいと思うなら
ゴネれば年齢制限が下な分はなんとかなる…んじゃないかな
ならないかもしれない
なってほしいけど
Avatar
kateinoigakukun 13-Feb-18 04:19 AM
興味はあるので試してみます
😁 4
Avatar
kitasuke 13-Feb-18 04:20 AM
これは楽しそうだ
Avatar
tarunon 15-Feb-18 04:27 AM
iOSでSwiftのStaticLibraryを作る/使うときのデメリットって何かありますか?ちょっと考えたけど、ライブラリ提供者側がターゲット追加するのが面倒くさい以外思いつかなかった。 (edited)
Avatar
omochimetaru 15-Feb-18 04:28 AM
それは、Dynamicとの対比で?
Avatar
tarunon 15-Feb-18 04:28 AM
Y
Avatar
Kishikawa Katsumi 15-Feb-18 04:29 AM
どうだろう。基本的にはiOSの場合はStaticの方がメリットは多いと思いますね。
Avatar
omochimetaru 15-Feb-18 04:29 AM
Xcodeでちゃんと設定すればいけるのか。Staticのほうが起動が早いって話を見るよね。技術的にもデメリットは無さそう。どうせ毎回バンドルされちゃってるので。
Avatar
Kishikawa Katsumi 15-Feb-18 04:30 AM
デメリットはまだ一般的ではないとかですかね。
Avatar
tarunon 15-Feb-18 04:30 AM
なるほど
ありがとうございます!
Avatar
omochimetaru 15-Feb-18 04:30 AM
Swift関係なく Static と Dynamic の絡んだ時の問題はあって
Avatar
Kishikawa Katsumi 15-Feb-18 04:30 AM
サードパーティのライブラリを使うとかで考えると、Staticにするのは自分でやることになるわけなので。
Avatar
omochimetaru 15-Feb-18 04:30 AM
Static-A , Dynamic-B, Dynamic(App)-C があるときに
Avatar
tarunon 15-Feb-18 04:30 AM
あー
Avatar
omochimetaru 15-Feb-18 04:31 AM
B -> A の依存と C->A の依存があると、 AのシンボルがB経由とC経由の両方でやってきて Cにリンクするときに衝突したりしなかったりとか
そういうのはある。
Avatar
tarunon 15-Feb-18 04:31 AM
3つくらいリファレンスのあるライブラリを引くとぶつかるのが
思い出した
前にSwiftからCか何かのライブラリを入れようとしておもちが踏んで話題に出してたのを思い出した
Avatar
omochimetaru 15-Feb-18 04:34 AM
根っこの仕組み上はDynamicにくっついてるStaticはかぶっててもDynamic間の接続でシンボルが露出しなければ大丈夫(バージョンが違う同じstaticlibを埋め込めるという意味でもある) なはずなんだけど、リンカーの挙動だかなんだかで中のstaticのシンボルも検査して衝突したり、上書きされたり、 よくわかってない、そこらへんのエクスポート挙動とかも本当はコントロールできるのかもしれない
Avatar
tarunon 15-Feb-18 04:34 AM
なるほど
Avatar
omochimetaru 15-Feb-18 04:35 AM
前にSwiftからCか何かのライブラリを入れようとしておもちが踏んで話題に
これはたんにprebuiltなCライブラリをリンクするのがSwiftPMだとシンドイ( -Xlinker を付けまくる)って話かも?
現行のSwiftPMは何もかもstaticにして最後に一気に実行ファイルのdynamicにリンクする感じだからうまくいくっぽいけど、途中で明示的にdynamic指定できるしそういうのどうなるんだろうなあ。
Avatar
hiragram 15-Feb-18 06:51 AM
スコープをなるべく短くするためにdoを使うのってどう思いますか
Avatar
Kishikawa Katsumi 15-Feb-18 06:52 AM
テストケースに書くことはよくありますけど、プロダクションのコードには大抵はもっといい方法があると思います。
Avatar
Avatar
Kishikawa Katsumi 15-Feb-18 06:53 AM
そもそもメソッドを分けるとか。
Avatar
t.ae 15-Feb-18 06:54 AM
do使う場合は変数多くてメソッド分けたくない場合な気がしますね
Avatar
hiragram 15-Feb-18 06:54 AM
例えばviewDidLoadで2つの複雑なObservableをmergeしたものをsubscribeしたいとなったときに、let hogeObservablelet fugaObservable をこねこね作って、Observable.merge(hogeObservable, fugaObservable) みたいに書きたい時に、 hogeObservablefugaObservable というローカル変数はなるべくスコープを短くしたい
Avatar
Kishikawa Katsumi 15-Feb-18 06:54 AM
まあ、それがベターな場合もあると思いますけど常用することはほとんどないですね。
Avatar
hiragram 15-Feb-18 06:55 AM
メソッド分けたくない理由もあって、「絶対に1回しか呼ばれないでほしい」ということがあります
Avatar
tarunon 15-Feb-18 06:55 AM
viewDidLoadの中でfunction作って
最後はそれを纏めて呼ぶからスッキリ終わるとか
Avatar
hiragram 15-Feb-18 06:55 AM
func派か
Avatar
Kishikawa Katsumi 15-Feb-18 06:55 AM
そっすね。inner functionかクロージャに閉じ込めるかな。
Avatar
tarunon 15-Feb-18 06:55 AM
或いはそのための型を作るとか
Avatar
Kishikawa Katsumi 15-Feb-18 06:56 AM
2つの変数は戻り値で受け取るか、そのまま渡す。
的な。
Avatar
hiragram 15-Feb-18 06:56 AM
- catch無しのdo { } - inner func - 無名クロージャ のどれかかと思って、doが一番ラクかなと思っていました。
Avatar
Kishikawa Katsumi 15-Feb-18 06:56 AM
まあでもそこかしこにあるんじゃなかったらdoでもいいと思いますよ。
そこかしこに書かないというだけで。
Avatar
rintaro 15-Feb-18 06:57 AM
僕は 一回しか呼ばれない 内部func 作るくらいなら do の方が良いと思います。
Avatar
hiragram 15-Feb-18 06:57 AM
funcだと実装と実際に呼ばれるところが違うので処理が追いづらそうと思います
Avatar
t.ae 15-Feb-18 06:57 AM
後ろ2つは呼び出しのオーバーヘッドありますよね?最適化できえるのかな
Avatar
hiragram 15-Feb-18 06:57 AM
doなら上から下に読めばおわりなので。
Avatar
rintaro 15-Feb-18 06:57 AM
ただ do にラベル付けた方が良い。
Avatar
hiragram 15-Feb-18 06:57 AM
あー最適化まわりは明るくないので、教えてほしいです。
Avatar
tarunon 15-Feb-18 06:57 AM
ラベル付きDO!
Avatar
hiragram 15-Feb-18 06:57 AM
doにラベル
Avatar
tarunon 15-Feb-18 06:57 AM
よさそう
Avatar
hiragram 15-Feb-18 06:57 AM
やばい知らなかった
Avatar
Kishikawa Katsumi 15-Feb-18 06:57 AM
一回しか呼ばれないもののオーバーヘッドは考慮する必要ないかな。
Avatar
tarunon 15-Feb-18 06:58 AM
breakとcontinueができるようになる奴でしたっけw
Avatar
Kishikawa Katsumi 15-Feb-18 06:58 AM
どっちが速いかよりもどっちが読みやすいかのようが優先度が高いです。 (edited)
Avatar
t.ae 15-Feb-18 06:58 AM
内部で一回でも全体として複数回呼ばれることはあるので……
Avatar
rintaro 15-Feb-18 06:59 AM
breakとcontinue が出来るのはたしかにそうですが、しなくても ラベルあった方がわかりやすい。
Avatar
hiragram 15-Feb-18 06:59 AM
「1回しか実行されてほしくない」というニーズもあるので、そうするとやっぱdoかな
Avatar
Kishikawa Katsumi 15-Feb-18 06:59 AM
全体として複数回呼ばれるとしてもdoブロックとFunctionの呼び出し速度が問題になるケースはほとんどないはずです。
それくらい呼ばれないと差は出ない。
Avatar
Avatar
tarunon 15-Feb-18 07:02 AM
viewDidLoad自体のオーバーヘッドのほうが大きすぎて、その中がfunctionかどうかは問題にならないですね
この場合だと
Avatar
t.ae 15-Feb-18 07:03 AM
viewDidLoadだと全くそうですね
Avatar
tarunon 15-Feb-18 07:04 AM
昔struct使ってstatic funcの真似事するワークアラウンドあったと思うんですけど、1時代
Avatar
hiragram 15-Feb-18 07:04 AM
「この処理はうっかり2回呼んじゃうのは防ぎたい」というシーンが結構多くて、そうするとviewDidLoadとかdidSetがどんどん長くなるんですが、個別のスコープは短く保ちたいので,
toiu
というニーズがあった。
Avatar
tarunon 15-Feb-18 07:04 AM
型作るのが良いと思う
Avatar
hiragram 15-Feb-18 07:05 AM
絶対1回しか実行されない型?
Avatar
tarunon 15-Feb-18 07:05 AM
ViewDidLoadのライフサイクルで実行するための型
Avatar
hiragram 15-Feb-18 07:05 AM
まだ全然わかんないけど気になる
Avatar
tarunon 15-Feb-18 07:05 AM
うーんだめか、一回しか呼ばれないを担保出来るものではないぽい
Avatar
koher 15-Feb-18 07:11 AM
話に加わり損ねましたが、僕も do 派です。ローカル関数やクロージャ式にすると実行順がコードの記述順と入れ替わる可能性があり、それを意識しないといけないのが難点だと思います。
クロージャ式即呼び出しは入れ替わらないか。
Avatar
hiragram 15-Feb-18 07:11 AM
同意見です。
Avatar
koher 15-Feb-18 07:11 AM
けど、 { ... }() はわかってればいいけど可読性的に微妙かなと。
あと、 do だと内部から break 等できるけど、ローカル関数やクロージャ式だとできないというのもあります。
Avatar
hiragram 15-Feb-18 07:12 AM
あーそうだそうだ。それもあったんだった。
個別のスコープでguardに引っかかったりして早期離脱したときに、そのdoだけスキップして次のdoをやってほしい、っていうのが
viewDidLoadをreturnで抜けてほしいわけじゃないんだよな〜というのが。バグを生みそう。
なのでやっぱりdoがしっくりくる
(for inじゃなくて頑なにforEachを使うのも同じ理由)
Avatar
Kishikawa Katsumi 15-Feb-18 07:14 AM
私は{ ... }() の方が読みやすい感覚があるんですよね。do{}はパッと見てtryか、と思ってしまうので。
Avatar
hiragram 15-Feb-18 07:15 AM
無名クロージャだとselfって書かなきゃいけないのが地味に面倒ですね (edited)
Avatar
koher 15-Feb-18 07:15 AM
あと、最近↓みたいなコード書いたことがあります。が、これ自体は可読性低いよなぁと感じて、単純に終了処理 2 回書いた方がいいか迷ってます。
do { ... // 開始処理 defer { ... // 終了処理 } guard ... { ... break } ... }
Avatar
tarunon 15-Feb-18 07:15 AM
あれ
escapingならselfいらないんじゃ
Avatar
hiragram 15-Feb-18 07:16 AM
あそっか
即実行ならいらないか
escapingならself必須では 逆
言いたいことはわかった
Avatar
tarunon 15-Feb-18 07:16 AM
逆だ
Avatar
hiragram 15-Feb-18 07:17 AM
koherさんのdeferのやつは、自分も迷いますね
guardがいっぱいあるとか、dono
doの中身が長いとかだったら全然ありだと思います。
Avatar
koher 15-Feb-18 07:18 AM
↑のは do の後も続いてて
Avatar
tarunon 15-Feb-18 07:19 AM
util作って可読性高めてもいいけど、あんまやると魔界化するからなぁ
Avatar
koher 15-Feb-18 07:19 AM
do を抜けるタイミングで終了処理を挟み込みたかったんですが、早期脱出もしたかったので、両方の終了処理を共通化しようとしたらこうなったけど、可読性は低いよなぁと。共通化を諦めて個別に書いた方がいい気もしてます。
while ... { do { ... // 開始処理 defer { ... // 終了処理 } guard ... { ... break } ... } ... }
Avatar
Kishikawa Katsumi 15-Feb-18 07:20 AM
UIKitでしょうがないケースはあると思うけど、基本的に長いとかは適当な単位でメソッドなり関数なりに分割するのがシンプルに良いと思いますね。
^ の例のwhileは状態をもってループするオブジェクトがあったらいいんじゃないですかね。
while自体をなくす
Avatar
koher 15-Feb-18 07:21 AM
基本的に長いとかは適当な単位でメソッドなり関数なりに分割するのがシンプルに良いと思いますね。
これは僕もそう思います。基本的には do より関数やメソッドに分割が望ましいと思います。
Avatar
tarunon 15-Feb-18 07:21 AM
これちゃんとラベル使って
breakで何を脱出するのかラベル付して明示すればわかりやすくなる
Avatar
rintaro 15-Feb-18 07:22 AM
可読性が第一なのは全員同意として、単純に実験してみました。
public func AAAAAAA(x: Int) { func step1() { /* ... */ } func step2() { /* ... */ } step1() step2() } public func BBBBBBB(x: Int) { ({ // step 1 /* ... */ })() ({ // step 2 /* ... */ })() } public func CCCCCCC(x: Int) { STEP1: do { /* ... */ } STEP2: do { /* ... */ } }
/* ... */ に十分長い処理を書いて試したところ、-O でも 内部 func と クロージャはインライン化されなかったです。ちょっと意外。
👀 1
Avatar
tarunon 15-Feb-18 07:22 AM
LOOP: while ... { ACT1: do { ... // 開始処理 defer { ... // 終了処理 } guard ... { ... break ACT1 } ... } ... }
こうかな
Avatar
Kishikawa Katsumi 15-Feb-18 07:23 AM
^ のwhileループは二次元の構造をループするとかかな。
そういうので長くなってしまうのをどうしたものかというのは何度か悩んだことがあります。
Avatar
koher 15-Feb-18 07:23 AM
自分で言ってて矛盾してる気がしてきた。ローカル関数より do を使うといいながらメソッドに切り出した方がいいというのは変だ・・・。
Avatar
Kishikawa Katsumi 15-Feb-18 07:24 AM
読みやすいのはAAAAAAAじゃないですかね。ぱっと見の印象。
Avatar
tarunon 15-Feb-18 07:24 AM
内部func、overload出来ないし何やら色々途中な匂いがしてます
そういえば内部func使うと検知するのがクソ難しいメモリリーク出来る気がする
Avatar
hiragram 15-Feb-18 07:24 AM
再利用できる必要が無いのにスコープを分割するためにメソッドに切り出すのは僕はあんまり好かないですね
@tarunon 内部funcの中でselfを使ってそれをクロージャの代わりにどっかに渡すとうっかりselfのretain countが増えるとか そういう? (edited)
Avatar
Kishikawa Katsumi 15-Feb-18 07:25 AM
func step1() {の定義は自然に読み飛ばすので、私の目には step1() step2() だけに見える。
Avatar
koher 15-Feb-18 07:25 AM
↑のは僕は CCCCCCC が読みやすいですね。
Avatar
tarunon 15-Feb-18 07:25 AM
@hiragram そんな感じ
Avatar
Kishikawa Katsumi 15-Feb-18 07:25 AM
それ以外のBとCはstepの中身を読まされるのがちょっと、って感じですね。
必要なければ中身は読みたくない、という印象。
Avatar
hiragram 15-Feb-18 07:26 AM
この例だとstepAとBだからわかりやすいけど、個別の実装が何をしていて、更にそれがどういう順番でどこで呼ばれてるのか、っていうのを前知識ゼロから読むのはコストが高いと感じます
Avatar
koher 15-Feb-18 07:27 AM
自分で言ってて矛盾してる気がしてきた。
この気持を見つめ直してみたら、ステートレスでインプットとアウトプットがはっきりしていて処理の名前が付けやすいものは関数に切り出すとテストもできるしいいんだけど、もう少しコンテクストに依存していて(ごちゃごちゃローカル変数にアクセスしてたり)次の行で使うだけのローカル変数のスコープを短くしたいだけみたいなときは do を使いたいという気持ちでした。
Avatar
Kishikawa Katsumi 15-Feb-18 07:27 AM
1箇所からしか呼ばれないメソッドというのは全く問題ないと思います。意味をつけるためにメソッドや関数にするというのは基本的だと思います。
^ 上の例に限らず。 (edited)
Avatar
hiragram 15-Feb-18 07:28 AM
意味の付け方がdoのラベルかメソッド名か、ということだと思うので、そうするとメソッドに切り出すことによって再利用可能性という別にいらない性質を獲得してしまうのは考えなきゃいけないことを増やしているだけに感じます
Avatar
Kishikawa Katsumi 15-Feb-18 07:28 AM
まあしかし、すごい簡単な例でも実際にコードがあった方が議論しやすいですね。
Avatar
koher 15-Feb-18 07:28 AM
↓みたいなのとか。
let a = ... let b: B do { let t = ... // ちょっと複雑な式 b = foo(t, a) } let c = ...
Avatar
hiragram 15-Feb-18 07:28 AM
↑僕が最初に言いたかったのはまさにそういうことです。 (edited)
fooの引数にそのtを導出する式を直接書くのは見づらいことがおおいけど、tはそこでしか使わないからスコープは短くしたい。
Avatar
koher 15-Feb-18 07:29 AM
一箇所からしか呼ばれないことは僕も問題がないと思います。切り出すことでテストも書けますし。
↑のは無理すれば tfoo() の中に書けるけど、可読性のために変数に入れて名前を付けたくて、かといってそれを長々と生かしたくないみたいなケースです。
Avatar
Kishikawa Katsumi 15-Feb-18 07:30 AM
^ の例の話なら、そのdoはない方がいいんじゃないかな。tのスコープが長いのは別に問題ないです。
tの名前が足りない場合はしょうがない。
Avatar
hiragram 15-Feb-18 07:31 AM
あーそうなんですか
うーん
そうすると短いスコープなら t で済む一時変数にどこで何に使われてるかわかる説明的な名前を付ける必要が出てきませんか
Avatar
Kishikawa Katsumi 15-Feb-18 07:31 AM
それが本当にtという名前をつけるならdo {}を使いますね。
Avatar
tarunon 15-Feb-18 07:32 AM
なんだろ
導出が複雑な工程を関数に切り出すのは自然なことで
もしかして、「それを複数回呼ばれたら崩壊する」方が問題なのでは?
Avatar
Kishikawa Katsumi 15-Feb-18 07:32 AM
そうじゃなくてtとかは例で、長い式を一旦変数においているという意味で、実際はもうちょっとちゃんとした名前があるということならdo {}はない方が読みやすいです。 (edited)
もしかして、「それを複数回呼ばれたら崩壊する」方が問題なのでは?
Avatar
tarunon 15-Feb-18 07:33 AM
ObservableごちゃごちゃやってHotとColdでトンチンカンみたいになってるんじゃないかしら
Avatar
hiragram 15-Feb-18 07:33 AM
@tarunon 手でNSLayoutConstraintを貼るとか、selfのDisposeBagにsubscriptionをつめつめするとか、そういうのもそうじゃない?
Avatar
Kishikawa Katsumi 15-Feb-18 07:33 AM
まあこの条件がなければシンプルかもしれないですね。
Avatar
koher 15-Feb-18 07:33 AM
本当に t という名前を付けることを意図したわけじゃないですが、僕はそのコンテクストでできるだけシンプルな名前を使うのが好きなので、後続処理と名前がかぶって困るということは結構ある気がします。
Avatar
hiragram 15-Feb-18 07:33 AM
そこで2回呼ばれても大丈夫なためのボイラープレートを書くなら、1回しか呼ばれないことが明らかな書き方をシンプルに書くほうが好きかな
Avatar
koher 15-Feb-18 07:34 AM
3 行くらいなら僕も do なくてもいいんですが、 10-20 行くらいになってくると一度スコープ切っておきたいですね。
Avatar
tarunon 15-Feb-18 07:34 AM
Subscription作るところは複雑だけど、Bagにつめるのは複雑にはならないはず。
Avatar
Kishikawa Katsumi 15-Feb-18 07:34 AM
NSLayoutConstraintのコードはまあひとかたまりでdo{}ブロックを作りつつ、長いviewDidLoadでいいと思います。
Avatar
tarunon 15-Feb-18 07:34 AM
手でLayoutConstraintは気持ちはわかるけどちょっと考えたほうが良いのがワイの自論
Avatar
Kishikawa Katsumi 15-Feb-18 07:36 AM
どう違うのかというと、UIのコードはメソッドに分けて名前をつけてももわかりやすくもならないのでdoや空行で分けるくらいで十分、Swiftならdoでしょう、ということですね。
Avatar
tarunon 15-Feb-18 07:36 AM
Subscription複雑問題も、複雑なのはObservable組み合わせて川作る部分だけで
結局それってsubscribeしないと無害なはずだから、そこで分ければなんとかなると思うけど
Observableの時点で副作用バキバキなのは、もうちょっと頑張ったほうがいい
Avatar
hiragram 15-Feb-18 07:37 AM
分割したメソッドの中でsubscribeするんじゃなくて、Observableを返すようにしようやということだよね
Avatar
tarunon 15-Feb-18 07:37 AM
せやな
Avatar
hiragram 15-Feb-18 07:37 AM
まあ
チームメンバーがみんなそういうコード書ければ…
👮 1
Avatar
tarunon 15-Feb-18 07:38 AM
警察業務がんばろ
Avatar
hiragram 15-Feb-18 07:38 AM
という感じなので誰の目にもあきらかな見た目のほうがいいんじゃね?と。
Avatar
tarunon 15-Feb-18 07:39 AM
func これこれこういうイベントで発火するObservableだよ() -> Observable<E> func viewDidLoad() { これこれこういうイベントで発火するObservableだよ() .subscribe { 期待した結果やで } .disposed(by: disposeBag) }
イケルと思うけどなぁ
Avatar
hiragram 15-Feb-18 07:40 AM
func setupこれこれこういうイベントで発火する奴() { viewModel.hoge.subscribe().disposed(by: bag) }
こうなってるのがいっぱいある。
わかる。
Avatar
tarunon 15-Feb-18 07:41 AM
因果が逆転している
Avatar
Kishikawa Katsumi 15-Feb-18 07:41 AM
後者の方は基本的にfragileなのでまあ微妙といえば微妙だけど。
func これこれこういうイベントで発火するObservableだよ() -> Observable<E> <= これ自体は何回呼んでも、いつ呼んでもいいわけですよね?
前者の方。
Avatar
hiragram 15-Feb-18 07:43 AM
です。
Avatar
Kishikawa Katsumi 15-Feb-18 07:43 AM
そういう風に書くのがいいんじゃないですかね。
さらにstatic funcにして余計な状態を間違って変更しないようにしてしまう。
Avatar
hiragram 15-Feb-18 07:46 AM
あ、最初の話ちょっと変わっちゃうんですが、↑こういうインスタンスメソッドである必要がなくなった時にstaticにするのはよくやるんですけど、これが型のstaticプロパティにすら依存していないものだったら型の外にprivate funcとして書くのってどう思いますか
Avatar
Kishikawa Katsumi 15-Feb-18 07:47 AM
それをやりたいのは型名を省略できるからですかね。
Avatar
hiragram 15-Feb-18 07:47 AM
その型の役割ですら無いメソッドのとき って感じですね
Avatar
Kishikawa Katsumi 15-Feb-18 07:48 AM
いいと思いますね。
Avatar
omochimetaru 15-Feb-18 07:48 AM
追いついた
Avatar
hiragram 15-Feb-18 07:48 AM
ようこそ
Avatar
omochimetaru 15-Feb-18 07:48 AM
型に逃がす派の意見はあったかしら
Avatar
hiragram 15-Feb-18 07:48 AM
@tarunon がありそうだけど無理じゃねって自己解決してた
Avatar
tarunon 15-Feb-18 07:48 AM
やりたいことは出来ないなぁ→やりたいことがおかしいでしょ(完)
Avatar
hiragram 15-Feb-18 07:49 AM
シンプル
Avatar
omochimetaru 15-Feb-18 07:49 AM
func outer() { var state1 = ... var state2 = ... func inner1() { } func inner2() {} inner1() inner2() }
↑これ系のスタイルは
class HogeSetUpHelper { var state1 var state2 func inner1() func inner2() func setUp(...) } func outer() { HogeSetUpHelper().setUp(self) }
こういうふうに逃がせるはずで
Avatar
tarunon 15-Feb-18 07:50 AM
ワイのイメッジはまさにそれだった
Avatar
omochimetaru 15-Feb-18 07:50 AM
これだと、部分処理をメソッドに切り出した結果、関係ないところから2回目の呼び出しがされちゃう問題は
回避できるし
Helperを書くところで、依存・参照するシンボルははっきりわかるようにできる
(↑の例だとself渡しちゃてるけど、必要なものをずらずら渡すと、より見通しがよくなる)
Avatar
tarunon 15-Feb-18 08:00 AM
関係ないところからはやられないんだが、
HogeSetUpHelper().setUp(self)
↑こいつを複数回呼び出されることは封印できない
Avatar
omochimetaru 15-Feb-18 08:00 AM
それはviewDidLoadの場合でも2回呼ばれる可能性は残ってるからねえ。 (edited)
Avatar
tarunon 15-Feb-18 08:00 AM
実際はそうなんだけどね
viewDidLoad明示呼び出しとかはさすがにLintingでなんとか出来るけど
これ系いっぱいあるとLintでは難しい、それ用に型作ればまあいけるかなぁ。
Avatar
hiragram 15-Feb-18 08:01 AM
vc.viewにnil突っ込んだとき以外に2回目呼ばれるときあるけ?
Avatar
tarunon 15-Feb-18 08:01 AM
昔はだな…
Avatar
hiragram 15-Feb-18 08:01 AM
愚か者が明示的に呼ぶのも覗いて
Avatar
omochimetaru 15-Feb-18 08:01 AM
いや、愚か者の話
Avatar
Kishikawa Katsumi 15-Feb-18 08:01 AM
今はないです。
Avatar
hiragram 15-Feb-18 08:01 AM
2018年にvc.viewにnil突っ込むことってある?
Avatar
Avatar
koher 15-Feb-18 08:02 AM
みんなが好きな昔の viewDidLoadviewDidUnload の話だ。
Avatar
Kishikawa Katsumi 15-Feb-18 08:02 AM
理由がないならやる必要はないです。
Avatar
omochimetaru 15-Feb-18 08:02 AM
クラス名に HogeOnetimeSetUpHelper とでもしておけば。
Avatar
hiragram 15-Feb-18 08:02 AM
viewDidUnloadがあった(?)時代のこと僕全然知らないんですよねえ
Avatar
Kishikawa Katsumi 15-Feb-18 08:04 AM
さすがにアプリ内のメソッドを複数回呼ぶことについて対策するのは徒労だと思いますね。
そこまでチームが信用できないというのはそっちの方が問題。
Avatar
hiragram 15-Feb-18 08:06 AM
まあ人間というか、来週の自分すら信用できないので「おっ便利メソッドあるやんけ、ここでも呼んだろ」となりたくてもなれない仕組みを模索しているんですよね
Avatar
tarunon 15-Feb-18 08:06 AM
人間は信用できないわかる
Avatar
Kishikawa Katsumi 15-Feb-18 08:07 AM
いやまあでもキリがない話じゃないかなあ。
Avatar
omochimetaru 15-Feb-18 08:07 AM
2回呼べるという事が問題というより、メソッドとして同じレベルに並んじゃうと
Avatar
hiragram 15-Feb-18 08:07 AM
キリがないは、仰る通りです。
Avatar
Kishikawa Katsumi 15-Feb-18 08:07 AM
viewDidLoadは直接呼ばないでください、みたいなのと同じに聞こえますね。
Avatar
tarunon 15-Feb-18 08:07 AM
二回目呼んだら激おこ型作って、それでAssertすると多少は安全になるかもしれない
Avatar
omochimetaru 15-Feb-18 08:07 AM
グループ感がなくなってしまって、全部いっぺんに読むときの見通しが悪いというのがある
Helperクラスに切り出してあれば、グループであることはよくわかる。
Avatar
tarunon 15-Feb-18 08:08 AM
さっきのsetupperはVCのプロパティにいれて、一回までsetup呼べますみたいな
lazy var使えばちょっとシステマチックにそういうの出来るかもしれないけど考えるの面倒臭くなってきた
Avatar
omochimetaru 15-Feb-18 08:10 AM
おもちがコードの見通しにグルーブ感が無くなるとか言ってて流石に何言ってんだろって思ったけどグルーブじゃなくてグループだった。
Avatar
hiragram 15-Feb-18 08:11 AM
話題の本質でないからTwitterに書いたんだぞ
😋 1
Avatar
tarunon 15-Feb-18 08:20 AM
あーーーーーー
class X { lazy var setup: Void = { // only 1 time call here }() }
Avatar
hiragram 15-Feb-18 08:21 AM
どうやって呼ぶの
_ = setup ?
Avatar
tarunon 15-Feb-18 08:22 AM
_ = もいらないよ
Avatar
omochimetaru 15-Feb-18 08:22 AM
しぶいねw
Voidだからかw
Avatar
hiragram 15-Feb-18 08:22 AM
それwarningでない?
あー
Avatar
tarunon 15-Feb-18 08:22 AM
Voidだからね
Avatar
hiragram 15-Feb-18 08:22 AM
うわあ
Avatar
omochimetaru 15-Feb-18 08:22 AM
また変な技が・・・
Avatar
tarunon 15-Feb-18 08:22 AM
え?Functionみたいにしたいって?
しょうがないにゃぁ
Avatar
hiragram 15-Feb-18 08:22 AM
いきいきしてきたな
Avatar
tarunon 15-Feb-18 08:23 AM
class X { lazy var setup: () -> Void = { print("a") return { } }() } let x = X() x.setup()
ほらよ
(edited)
Avatar
omochimetaru 15-Feb-18 08:23 AM
嘘の () だ・・・
Avatar
hiragram 15-Feb-18 08:23 AM
嘘の()w
Avatar
tarunon 15-Feb-18 08:23 AM
ウケる
Avatar
hiragram 15-Feb-18 08:23 AM
や、うーん?
2個目のだと2回目の実行できん?
Avatar
tarunon 15-Feb-18 08:24 AM
やってみろ
Avatar
omochimetaru 15-Feb-18 08:24 AM
いや、嘘だからだいじょうぶ
printは1回w
Avatar
hiragram 15-Feb-18 08:24 AM
うわあ
うわあ。
😫 2
Avatar
Kishikawa Katsumi 15-Feb-18 08:24 AM
おもしろい
Avatar
hiragram 15-Feb-18 08:25 AM
脳内コンパイルにすっげえ時間かかった
Avatar
tarunon 15-Feb-18 08:25 AM
今evolutionでワイワイやってる実行可能な型が実現すれば (edited)
もうちょいスッと書けるようになりそう
Avatar
Biacco42 15-Feb-18 08:26 AM
return { }
Avatar
tarunon 15-Feb-18 08:26 AM
www
Avatar
Biacco42 15-Feb-18 08:26 AM
虚無だ…
Avatar
tarunon 15-Feb-18 08:26 AM
無を生成するコード
func nop() { } typealias Setup = () -> Void class X { lazy var setup: Setup = { // 1回だけ return nop }() }
少し見た目をマシにしてみた
😇 2
Avatar
omochimetaru 15-Feb-18 08:29 AM
let setup = once { }
こういう高階関数作れそうじゃない?
関数じゃなくてクロージャになっちゃうけど。
Avatar
tarunon 15-Feb-18 08:29 AM
onceいいすね
Avatar
koher 15-Feb-18 08:29 AM
「無を生成するコード」で思い出したけど、ちょっと話がそれるけど、この前
fooLoop { (`break`: () -> Never) in ... }
みたいな break を作りたかったけどできなくて悲しくなった。
Avatar
rintaro 15-Feb-18 08:30 AM
lazy 内 で self 参照出来るっていうのは正式にOKになったんだっけか。
Avatar
omochimetaru 15-Feb-18 08:30 AM
おお 良さそうだけどできないのか・・・ (edited)
たしかにbreak文ってそのループで見たらNever式だ。
Avatar
tarunon 15-Feb-18 08:31 AM
ウェイ
func nop() {} func once(_ f: () -> Void) -> () -> Void { f() return nop } class X { lazy var setup = once { print("1time?") } } let x = X.init() x.setup() x.setup()
こんなことしてる場合じゃないわ
Avatar
omochimetaru 15-Feb-18 08:34 AM
public func once<T, R>(_ f: @escaping (T) -> R) -> (T) -> R { var done: Bool = false return { (t: T) -> R in guard !done else { fatalError("do not twice") } done = true return f(t) } }
(edited)
Avatar
tarunon 15-Feb-18 08:45 AM
そのonceだと引数0がVoidでしか出来なくて
setup(())になるからオーバーロード欲しいすね
Avatar
omochimetaru 15-Feb-18 08:52 AM
gysb?
func once<R> func once<T1, R> func once<T1, T2, R> ...
Avatar
tarunon 15-Feb-18 09:02 AM
よさそう
Avatar
mitsuse 15-Feb-18 10:16 AM
(気になってひさびさに開きましたがやっと追いついた..) tarunon が書いた lazy var のパターンを最初の方の once にまとめた方に置き換えたことありますね.
置き換え前のコード, イディオム感があって, 本当に一度しか実行されないのかぱっと見で分かりづらかったり, lazy var の最初の方と後の方のパターンが混在していて, 他のメンバーが混乱し気味だったので (書いてもらう場合も once に突っ込んでもらえば良いので楽). 後, 他の lazy var と見分けづらいとか云々.
おもちさんの方の once は思いつかなかった. done 掴んでるんですねこれ.
Avatar
tarunon 15-Feb-18 10:17 AM
>追いついた どこからスタートしたんだろう🤔
Avatar
omochimetaru 15-Feb-18 10:18 AM
そう、doneをキャプチャしてる
Avatar
mitsuse 15-Feb-18 10:19 AM
ちょっと境目がわからなかったので, do, inner func かどうかかのあたりから, もっと前はさすがに読めてない (edited)
Avatar
omochimetaru 15-Feb-18 10:22 AM
public func once<T, R>(_ f: @escaping (T) -> R) -> (T) -> R { var done: Bool = false return { (t: T) -> R in guard !done else { fatalError("do not twice") } done = true return f(t) } } public class Cat { public init(name: String) { self.name = name self.onBorn() } public var name: String public func onBorn() { _onBorn(self) } private let _onBorn: (Cat) -> Void = once { `self` in print("\(self.name)がうまれた") } } Cat(name: "tama")
onBorn を let にしたかったけど self がキャプチャできなかったので func onBornlet _onBorn に分かれてしまう。
public class Cat { public init(name: String) { self.name = name self.onBorn() } public var name: String public lazy var onBorn: () -> Void = once { [unowned self] in print("\(self.name)がうまれた") } }
lazyだと使えるのか。でもこれじゃ駄目だなあ
Avatar
norio_nomura 15-Feb-18 10:31 AM
おもちさんのonce動かないのでは。
Avatar
omochimetaru 15-Feb-18 10:33 AM
まだ動かしてなかった
Avatar
tarunon 15-Feb-18 10:34 AM
public func once<T, R>(_ f: @escaping (T) -> R) -> (T) -> R { var done: Bool = false return { (t: T) -> R in guard !done else { fatalError("do not twice") } done = true return f(t) } } class Cat { let born = once { () in print("mew") } } let c = Cat() c.born(()) c.born(())
動いてるように見える
Avatar
norio_nomura 15-Feb-18 10:38 AM
これが動いてないだけだった。
public class Cat { public init(name: String) { self.name = name self.onBorn() } public var name: String public lazy var onBorn: () -> Void = once { [unowned self] in print("\(self.name)がうまれた") } }
Avatar
omochimetaru 15-Feb-18 10:41 AM
メソッドの呼び出しの間はselfが生きてないといけないからそれダメなんすよね かといって強参照したら循環だし
Avatar
tarunon 15-Feb-18 10:45 AM
iOSDCで僕が言ったアレだ
「Closureではメソッドの完全な代替は出来ないんですよ」
Avatar
omochimetaru 15-Feb-18 10:47 AM
@bannzai さんのコレの質疑ね https://speakerdeck.com/bannzai/xiang-jie-objective-c
iOSDC 2017でお話しする内容です https://iosdc.jp/2017/node/1364 Objective-Cについて熱く語ります
Avatar
tarunon 15-Feb-18 10:47 AM
それそれ
[weak self] _ in guard let `self` = self else { return }
これで
(edited)
実行した瞬間にキャプチャ生まれないかな
Avatar
omochimetaru 15-Feb-18 10:50 AM
weakだから間に合わない
Avatar
tarunon 15-Feb-18 10:50 AM
呼び出したときだけだわ
アカン
Avatar
omochimetaru 15-Feb-18 10:51 AM
SwiftのARC生成のタイミング次第だけどキリキリに生成されたらダメ
Avatar
norio_nomura 15-Feb-18 11:27 AM
これdeinitちゃんと呼ばれるのね。
func once(_ f: () -> Void) -> () -> Void { f() return {} } public class Cat { public init(name: String) { self.name = name self.onBorn self.onBorn } public var name: String public lazy var onBorn = once { print("\(self.name)がうまれた") } deinit { print("deinit") } } do { Cat(name: "test") }
Avatar
rintaro 15-Feb-18 11:29 AM
クロージャ自体のインスタンス化は、(Cat.init時ではなく)lazyアクセス時なので、クロージャがどこにも参照残らなければ大丈夫ですね。 (edited)
Avatar
omochimetaru 15-Feb-18 11:30 AM
あれ?なんでだ?
Avatar
tarunon 15-Feb-18 11:31 AM
onBornがキャプチャしてるのは、無なので
セーフ
Avatar
omochimetaru 15-Feb-18 11:32 AM
あ、よくみたら、onceの実装が。
そゆことか、lazy varの右辺を使う たるのん方式の 嘘クロージャのパターンか。
自分が書いたやつだとリークした。
Avatar
tarunon 15-Feb-18 11:34 AM
キャプチャ対象は無で、クロージャはキャプチャされないので。
Avatar
norio_nomura 15-Feb-18 11:54 AM
onceVoidではなく() -> Voidを返すのも地味に良い。
Avatar
tarunon 15-Feb-18 11:55 AM
それ嘘ですけどね
Avatar
norio_nomura 15-Feb-18 11:56 AM
Voidだとlazyの受け側に型指定がないとwarningが出るので。
Avatar
norio_nomura 15-Feb-18 12:13 PM
lazyself参照出来るようになったのはSwift 4.0から?
Avatar
rintaro 15-Feb-18 12:14 PM
それ自体はだいぶ前から出来たけど、中途半端で、正式には https://github.com/apple/swift/pull/9920 だと思います。
Avatar
norio_nomura 15-Feb-18 12:18 PM
Swift 3.1.1までは
public struct S { init() {} public lazy var p = self.f() func f() -> String { return "f()" } } var s = S() s.p
error: use of unresolved identifier 'self' public lazy var p = self.f() ^~~~
になります。
(edited)
そのPRはswift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-06-a以降ですね。
Avatar
norio_nomura 17-Feb-18 04:33 AM
if caseパターンって、キャスト?もされるのね。知らなかった。
import Foundation enum MyErrorEnum: Error { case message(String) } struct MyErrorStruct: Error {} class MyErrorClass: Error {} extension String: Error {} func check(error: Error) { if case MyErrorEnum.message = error { print("expected error: \(error)") } else { print("unexpected error: \(error)") } } check(error: MyErrorEnum.message("error")) check(error: NSError(domain: "custom error", code: -1, userInfo: nil)) check(error: MyErrorStruct()) check(error: MyErrorClass()) check(error: "StringError")
expected error: message("error") unexpected error: Error Domain=custom error Code=-1 "(null)" unexpected error: MyErrorStruct() unexpected error: __lldb_expr_90.MyErrorClass unexpected error: StringError
(edited)
Avatar
norio_nomura 17-Feb-18 04:42 AM
これのおかげで、associated valueは無視して期待するError enumが投げられるかどうかのテストを
XCTAssertThrowsError(try YAMLDecoder().decode(Sample.self, from: invalidYaml)) { error in if case DecodingError.typeMismatch(_, _) = error {} else { XCTFail("unexpected error: \(error)") } }
の様に記述できる。
(edited)
Avatar
tarunon 17-Feb-18 04:57 AM
if case、局所的なパターンマッチなのでいろいろ出来る。後置なので補完効かないのがつらい。
Avatar
omochimetaru 17-Feb-18 08:34 AM
補完効かないソレな
Avatar
Kishikawa Katsumi 21-Feb-18 04:44 AM
AppCodeは
switch x { case 0: break case 1: print(y) print(z) default: print(y) print(z) }
こういう複数のcaseを1行に書いたら構文エラーをレポートする。コンパイルはswiftcだからビルドはできる。独自Parserがあるんだな。
Avatar
rintaro 21-Feb-18 04:47 AM
うわぁ、これは swiftc はエラー出すべきですね。
Avatar
Kishikawa Katsumi 21-Feb-18 04:48 AM
あ、そっちが間違いです?じゃあ調べてバグレポートしますかね。
Avatar
rintaro 21-Feb-18 04:49 AM
Consecutive statements on a line must be separated by ';' になっちゃうと思いますが。
このエラー大嫌い。
Avatar
Kishikawa Katsumi 21-Feb-18 04:50 AM
それぞれのcaseラベルはstatementじゃないんじゃないですかね。
Avatar
rintaro 21-Feb-18 04:52 AM
確かに "statement" ではないですね。
Avatar
Kishikawa Katsumi 21-Feb-18 04:53 AM
あ、なので構文としては正しいのかなと思っていまして。見る限り曖昧な部分もないですし。
Avatar
lovee 21-Feb-18 04:54 AM
構文として case 1 の時に print(y);print(z) の動作ですか?
Avatar
Kishikawa Katsumi 21-Feb-18 04:54 AM
そうです。
Avatar
lovee 21-Feb-18 04:54 AM
なるほど
確かに読むと case 1 見落としやすいので構文エラーにして欲しい感 is ある 🤔
Avatar
Kishikawa Katsumi 21-Feb-18 04:55 AM
文は適当なので動かしてないから違うかもしれないですけど、そう動くように見えます。
Avatar
rintaro 21-Feb-18 04:56 AM
あいまい性がないのはそうですが、
func foo() {} func bar() {}
これも曖昧ではないけどエラーになるので、同じポリシーで行くべきだと思います。
Avatar
omochimetaru 21-Feb-18 04:57 AM
なるほど
Avatar
Kishikawa Katsumi 21-Feb-18 04:58 AM
確かにそれとかclass A{}; protocol B {};とかはセミコロン必要ですよね。
構文エラーでよさそうです。
話変わるんですけど if value==1 {}はOKだけどif velue!=1 {}これがダメなのは理解できるけどわかりにくいから演算子は全部スペース必要でいいんじゃないかと思ったりしてます。
Avatar
omochimetaru 21-Feb-18 05:03 AM
たしかに、二項演算子のスペース無しは無くても良さそう。
両方ともスペースあけるか、両方ともつけないかしか許さないようになってるけど、 後者そもそもいるのか
Avatar
hironytic 21-Feb-18 05:04 AM
.. とか ..< は?
Avatar
omochimetaru 21-Feb-18 05:05 AM
うっ、たしかに、それはくっつけたいw
Avatar
Kishikawa Katsumi 21-Feb-18 05:05 AM
そうですね。
Avatar
hironytic 21-Feb-18 05:05 AM
そうなんですよ。これだけスペースあけないのも変な気がしつつ、くっつけたいやつなんです。
Avatar
koher 21-Feb-18 06:30 AM
でもオペランドに式書く場合はくっつけたくないんですよね〜 a ... (b + foo(c)) とか。 (edited)
👍 1
なので全部くっつけないというのもありなのかもと思ってます。
Avatar
omochimetaru 21-Feb-18 06:30 AM
丸括弧つかうときでも僕はくっつけてた 0..<(n*2) (edited)
Avatar
t.ae 21-Feb-18 06:31 AM
全部離すと単項演算子の.....<と変わるのが微妙そうですね
Avatar
omochimetaru 21-Feb-18 06:31 AM
離しても単項にはならないよ
1 + 2 の + は 二項
Avatar
t.ae 21-Feb-18 06:32 AM
いや0 ..< 3..<3で違うスペースの入れ方が強制されるのは微妙だなと
Avatar
omochimetaru 21-Feb-18 06:33 AM
ああ、 ..<3 は許されるのに 1..<3 が許されないのは揃ってないということか
Avatar
t.ae 21-Feb-18 06:33 AM
逆に今..< 3が許されてないのはいいんかという話にもなりかねませんが
Avatar
omochimetaru 21-Feb-18 06:33 AM
確かに。
Avatar
kateinoigakukun 21-Feb-18 08:46 AM
protocol A { associatedtype B associatedtype C where C == B.Hoge } struct D: A { typealias B = String typealias C = String }
where C == B.HogeHogeという型がBに無いのにコンパイルが通ってしまった。
そしてそこのwhere句の制約は無視されるようになってしまいました
Avatar
omochimetaru 21-Feb-18 08:48 AM
protocol HasHoge { associatedtype Hoge } protocol A { associatedtype B: HasHoge associatedtype C where C == B.Hoge } struct D: A { typealias B = String typealias C = String }
健全な形はこうか。
Avatar
kateinoigakukun 21-Feb-18 08:48 AM
それです
Avatar
omochimetaru 21-Feb-18 08:49 AM
B.Hoge って書いてある時点でエラーになりそうなのに確かに通るね
シンプルすぎて逆に謎・・・ バグか・・・?
Avatar
rintaro 21-Feb-18 08:49 AM
Xcode9.3 beta だとエラーになりますね。
Avatar
omochimetaru 21-Feb-18 08:49 AM
こちら Version 9.2 (9C40b) 古い
Avatar
hiragram 21-Feb-18 08:49 AM
Avatar
Avatar
kateinoigakukun 21-Feb-18 08:55 AM
こんなにシンプルなのに修正が結構最近なんですね〜
Avatar
tarunon 22-Feb-18 03:18 AM
assoctypeをwhere句で縛れるようになったのは4以降だから
バグ修正のタイミングとしては妥当に見える
でも報告自体は結構昔から有るのか
Avatar
hiragram 22-Feb-18 03:19 AM
kateiくんが見つけたの、まだ4に移行してないプロジェクトなんだよな
Avatar
lovee 23-Feb-18 02:04 AM
SomeType: SomeProtocol みたいなジェネリクスはもちろん必要だけど、逆に SomeType: !SomeProtocol みたいなジェネリクスも地味に欲しいよな…
Avatar
tarunon 23-Feb-18 02:05 AM
ある
直感的にはスッと出来ないのでは?という気がしている
Avatar
hiragram 23-Feb-18 02:05 AM
「ある」って
あるのか?
Avatar
Kishikawa Katsumi 23-Feb-18 02:06 AM
もうあるのかと思った。
Avatar
tarunon 23-Feb-18 02:06 AM
欲しい→わかる
すません😇
Avatar
Kishikawa Katsumi 23-Feb-18 02:06 AM
いや、またなんかHackが出てくるのかなーと思って
Avatar
tarunon 23-Feb-18 02:07 AM
期待値www
Avatar
hiragram 23-Feb-18 02:07 AM
型制約としては無理じゃない?Anyとしてしか扱えないし
Avatar
Kishikawa Katsumi 23-Feb-18 02:07 AM
コードが貼り付けられるのを待っていました。
Avatar
tarunon 23-Feb-18 02:07 AM
assoctypeにホンモノの実装への参照を当ててこいつをデフォルトVoidにすることで
なんちゃってやることはあるかな
そしてVoidはハイダメーみたいな感じにする
Avatar
koher 23-Feb-18 02:10 AM
<T: FooEnum> where T != case .foo> みたいなこともしたい・・・。
原理的に無理か。
Avatar
tarunon 23-Feb-18 02:11 AM
↑見返したら何もわからんかった、移動したらコード張ります
Avatar
hiragram 23-Feb-18 02:11 AM
実行時にきまるしなー
Avatar
koher 23-Feb-18 02:11 AM
でも case の一部を禁じたいこと多い。
Kotlin だったら継承関係持たせてグルーピングできるんだけど・・・。
enum じゃなくて sealed class で) (edited)
Avatar
t.ae 23-Feb-18 02:12 AM
なんかenumの部分集合のピッチだかありましたよね?それ入れてくれればいいのでは
Avatar
koher 23-Feb-18 02:13 AM
それ見てないな。でも自然な感じでできるのかなぁ?
Avatar
omochimetaru 23-Feb-18 02:13 AM
public class Holder<T> {} extension Holder { public func ho() { print("ho1") } } extension Holder where T == String { @available(*, unavailable) public func ho() { print("ho2") } } let a = Holder<Int>() a.ho() // これでいけるかと思ったら ho1 が出力された・・・ let b = Holder<String>() b.ho()
作戦失敗
(edited)
Avatar
t.ae 23-Feb-18 02:13 AM
部分集合じゃなくて継承だったかな? ぱっと見見つからない https://forums.swift.org/t/enum-inheritance/9933
Pitch: allow enums to inherit cases. Is this idea sound? Is this even possible given the current compiler implementation? Would this be a complex feature to implement for someone who isn’t familiar with the compiler’s codebase? Example: enum NetworkError: Error { case timedOut case cannotFindHost case notConnectedToInternet } enum MyAPIError: NetworkError { case responseInvalid case sessionExpired case notEnoughMinerals case insufficientVespineGas } func didRece...
Avatar
omochimetaru 23-Feb-18 02:14 AM
enumのcaseは全部同じenumの型になるから駄目じゃない?
Avatar
tarunon 23-Feb-18 02:15 AM
sealed class的な話かしら
Avatar
t.ae 23-Feb-18 02:15 AM
うーん。変数に入ってることを考えるとそうですね。
Avatar
koher 23-Feb-18 02:16 AM
↑の forum の、さすがに↓は壊れてるのでは?
enum NetworkError: Error { case timedOut case cannotFindHost case notConnectedToInternet } enum MyAPIError: NetworkError { case responseInvalid case sessionExpired case notEnoughMinerals case insufficientVespineGas }
(edited)
Avatar
omochimetaru 23-Feb-18 02:16 AM
そうですか?僕はアリだと思った 互換性は満たしていますよ
Avatar
koher 23-Feb-18 02:17 AM
これができたら外部から case を追加できちゃわない?
Avatar
omochimetaru 23-Feb-18 02:17 AM
集合 A = (a1, a2) , 集合 B = (a1, a2, b1, b2) なら A is B
Avatar
rintaro 23-Feb-18 02:17 AM
non-exhaustive enum が導入されればアリですね。
Avatar
omochimetaru 23-Feb-18 02:17 AM
ん?
追加された集合は別の名前。
NetworkErrorが増えたわけではないです
Avatar
koher 23-Feb-18 02:17 AM
: NetworkError だけど、 NetworkError として扱えるわけではない?? (edited)
Avatar
t.ae 23-Feb-18 02:18 AM
メソッドやなんかについては議論してますね
Avatar
omochimetaru 23-Feb-18 02:18 AM
あ〜たしかに?記法が変だな・・・
当然互換性は無いと思ってたけど継承と同じだからなんかそう見えますね・・・
Avatar
koher 23-Feb-18 02:18 AM
@rintaro non-exhaustive enum でも、アップデートで追加されるのと、アップデートを伴わずに自由に後付できるのは意味合いが違うような。 (edited)
Avatar
omochimetaru 23-Feb-18 02:19 AM
単に、 MyAPIError に対して NetworkError を代入できるって話だと思ってた。
Avatar
koher 23-Feb-18 02:19 AM
まあでも enum Foo: IntInt に入れられるわけじゃないからいいのかな?
Avatar
omochimetaru 23-Feb-18 02:19 AM
それは .rawValue 取れば絶対入れられる
Avatar
koher 23-Feb-18 02:19 AM
でも直接突っ込めはしない。
サブタイプではない、という意味で。
ただ、この場合は突っ込めることも保証されないから、 : Foo に新たな概念を追加することになるのか・・・。
Avatar
omochimetaru 23-Feb-18 02:21 AM
enum MyAPIError { spread case NetworkError case responseInvalid case sessionExpired case notEnoughMinerals case insufficientVespineGas }
↑こんな記法だったら良さそう。
(edited)
Avatar
rintaro 23-Feb-18 02:21 AM
>アップデートで追加されるのと、アップデートを伴わずに自由に後付できるのは意味合いが違うような たしかに。 むしろ non-exhaustive enum とコンフリクトするかも。
Avatar
koher 23-Feb-18 02:21 AM
@omochimetaru それなら良さそう。
むしろ struct でもほしい。
サブタイピングを伴わない継承。
Avatar
lovee 23-Feb-18 02:23 AM
すごい、コードとちょっと戦ってたらこんなに熱い議論にw
Avatar
omochimetaru 23-Feb-18 02:23 AM
@koher 手間はかかるけどprotocolとextensionを仕込めば、結構簡単にできますよ
Avatar
lovee 23-Feb-18 02:23 AM
ちなみに今一番切実に欲しいのは T: !Optional ですねw
Avatar
koher 23-Feb-18 02:26 AM
Kotlin だと↓ですね。 < T: !Optional
fun <T: Any> foo()
(edited)
Avatar
lovee 23-Feb-18 02:27 AM
SwiftだとOptionalもAnyに入るからな…
Avatar
t.ae 23-Feb-18 02:27 AM
ジェネリックなのを作って個別のをdeprecateとか
Avatar
omochimetaru 23-Feb-18 02:27 AM
// 親?クラス struct Animal { var name: String func speak() -> String { return "I am \(name)" } } // トリックここから protocol AnimalExtend { var animal: Animal { get set } var name: String { get set } func speak() -> String } extension AnimalExtend { var name: String { get { return animal.name } set { animal.name = newValue } } func speak() -> String { return animal.speak() } } // トリックここまで // ユーザー例 // プロトコル指定は継承指示 struct Cat : AnimalExtend { // コンパイルエラーがでるのでこれを定義 var animal: Animal // 必然的にこれも書くことになる init(name: String) { animal = Animal(name: name) } } print(Cat(name: "tama").speak()) // ok
こうやる。
Avatar
koher 23-Feb-18 02:28 AM
Kotlin は Any? がトップタイプですからねぇ。 Any で縛れば nullable を弾けますが、 Swift の Optional は union じゃないから同じことはできないんですよねぇ。
Avatar
lovee 23-Feb-18 02:30 AM
その代わりSwiftは Optional<Optional<T>> ができるのは魅力的ですが
難しいですね仕様
Avatar
koher 23-Feb-18 02:32 AM
Optional のネストはほしいですね。つい最近もやっぱいるよなと思ったけど何だったかな・・・。
Avatar
t.ae 23-Feb-18 02:33 AM
(JavaのOptionalを使えばいいのでは?)
Avatar
koher 23-Feb-18 02:33 AM
KotlinでJavaのOptional使うのは苦痛な気が。Java書いててもあまり使う気になれないのに。
@omochimetaru それをやるのが面倒なんよねぇ・・・。
😟 1
逆に、拡張はできない( Stored Property を追加できない)サブタイピングする struct の継承もほしい。
struct Path: String { // パス操作のための便利メソッド }
Path を型として分離できるし、 String として使いたいときはそのまま代入できる。
Avatar
omochimetaru 23-Feb-18 02:37 AM
うっかり?stored propertyを追加しない制約ってことですか?
Avatar
koher 23-Feb-18 02:38 AM
値型だからメモリレイアウトが同じじゃないといけないから、 Stored Property は追加できない。
Avatar
omochimetaru 23-Feb-18 02:38 AM
transparent struct Path: String { }
みたいな。
(edited)
なんかその話題は昔MLで見た気がする
Avatar
koher 23-Feb-18 02:38 AM
Path is String であるためには。
Avatar
omochimetaru 23-Feb-18 02:39 AM
ん?別に is String を取るだけなら
Avatar
koher 23-Feb-18 02:39 AM
ここ(か Slack )で話したこともある気がする。
let s: String = path ができたい。
Avatar
omochimetaru 23-Feb-18 02:39 AM
func asString() -> String が 自動で is や as で呼び出されれば大丈夫
型変換が暗黙に呼ばれたら良い
String is Path も取りたいなら駄目ですけどね
Avatar
koher 23-Feb-18 02:40 AM
暗黙の型変換じゃないところがいいところだと思うんだけどなぁ。
String is Path だと意味がない。
Avatar
omochimetaru 23-Feb-18 02:40 AM
うーん、そういうのは明示的な方が良いと思います
Avatar
koher 23-Feb-18 02:40 AM
Path のところに String 渡せてしまうから。
Avatar
omochimetaru 23-Feb-18 02:40 AM
.asString() で。
Avatar
koher 23-Feb-18 02:40 AM
いや、暗黙じゃないんよね。サブタイピングだから。
Avatar
omochimetaru 23-Feb-18 02:41 AM
それだったらstored propertyが増えても良くないですか?
Avatar
koher 23-Feb-18 02:41 AM
Path はあくまで String なんだけど、 Path として扱っているときは String を突っ込まれたくない。
StringPath は入れたいけど PathString は入れたくない。
Avatar
omochimetaru 23-Feb-18 02:41 AM
1. メモリが全く同じ、互換性は両方向にある 1-2. メモリは全く同じだけど暗黙な変換は Path is String の片方だけ 2. stored propertyが増えても良い 暗黙に Path is String 3. 現在の仕様で、随時 asString で明示的にアップキャスト (edited)
Avatar
koher 23-Feb-18 02:42 AM
メモリが全く同じだけど互換性を片方向にしたい。
typealias Path = String だと PathString を突っ込めてしまうけど
Avatar
omochimetaru 23-Feb-18 02:42 AM
1-2を希望というのはなんか不自然なような・・・
Avatar
koher 23-Feb-18 02:42 AM
String を引数にとる関数に Path を渡すときにいちいち変換したくない。
いや、 StringPath で話してるからわかりづらいのかも。
struct Age: Int {}
Avatar
omochimetaru 23-Feb-18 02:43 AM
AgeInt とか
ダブった
Avatar
koher 23-Feb-18 02:43 AM
同じ例をww
Avatar
omochimetaru 23-Feb-18 02:43 AM
ですよね
asInt 派です
FloatをDoubleに渡すときとかと一緒 (edited)
Avatar
koher 23-Feb-18 02:44 AM
えー
Weight: IntHeight: Int から BMI 計算するときに
Avatar
omochimetaru 23-Feb-18 02:44 AM
あ、ちなみにですけど
Avatar
koher 23-Feb-18 02:45 AM
いちいち変換するか、それとも演算子定義しないといけないよ。
Avatar
omochimetaru 23-Feb-18 02:45 AM
protocol IntConvertible { func asInt() -> Int } extension Age : IntConvertible {}
こうしておいて、X: IntConvertibleで受ければ
Ageをそのまま渡せる場所を明示的に指定できます
Avatar
koher 23-Feb-18 02:45 AM
FloatDouble はメモリレイアウトが違うし別の型だけど
AgeInt の用途を絞りたいだけだから、
Age is Int は OK だと思うんよね。
Avatar
omochimetaru 23-Feb-18 02:46 AM
あ〜aliasである意識が強いのか。
いちいち変換するか、それとも演算子定義しないといけないよ。
BMI計算はそこの変換がむしろ大事だと思っている
WeightとHeightが一緒の式に混ざるのが非常に危険で
そういうところで明示的に数字にアップするのが大事
ああそうか、 そういう型が二種類あって、合流する時が
中途半端で危険だなあ
Age is Intの例の方がまだ同意できて、むしろ Weight とHeightが一緒くたの式がかけるのは、ヤバイと思う (edited)
Avatar
koher 23-Feb-18 02:50 AM
うーん、でも今身長や体重を扱うなら Float とかにするわけでしょ?
Avatar
omochimetaru 23-Feb-18 02:50 AM
いや、場合によりますね
Avatar
koher 23-Feb-18 02:51 AM
struct Weight { let value: Float }
とか作って区別するっていうならわかるけど。
Avatar
omochimetaru 23-Feb-18 02:51 AM
それがアプリケーションでたくさん出てくるならちゃんと定義してます
Avatar
koher 23-Feb-18 02:51 AM
なるほど。
Avatar
omochimetaru 23-Feb-18 02:51 AM
なんかサーバーからとってきてちょっと表示するだけ、とかなら、危険が無いからFloatでサボるけど。
個人的にやって良かったと思うのは MoneyAmount とか TimePoint, TimeInterval(これはFoundationにもあるけど) とか
Date(Foundationのやつじゃなくて、時刻部分を持たない日付だけの型) とDateTimeとか
Avatar
koher 23-Feb-18 02:53 AM
typealias TimeInterval = Double じゃない?独自に作ったってこと?
Avatar
omochimetaru 23-Feb-18 02:53 AM
密に計算対象になったりするような場合、ちゃんと明示的な境界で守ってやると、あ〜よかった〜〜ってなることが多い
はい、そうです
例えばメディアプログラミングだと時間軸は有理数で扱いたいので。
Avatar
koher 23-Feb-18 02:54 AM
それはまた別の用途な気が。 < 有理数 (edited)
Avatar
omochimetaru 23-Feb-18 02:54 AM
浮動小数だと frameInterval * frame が FPS60でちゃんとかけても1.0秒にならなかったり。
いや
Rational型じゃなくて
ちゃんとTimeInterval型にしたってところが
ポイントですね。
Avatar
koher 23-Feb-18 02:54 AM
なるほど。
Avatar
omochimetaru 23-Feb-18 02:54 AM
TimePointとTimeIntervalは明示的にRationalにもっていってから計算対象になる。
Avatar
koher 23-Feb-18 02:55 AM
単位計算みたいなことを考えると、安易に Float にアップキャストされない方がいいような気もしてきた。
Avatar
omochimetaru 23-Feb-18 02:55 AM
ああ、そうだった、単位計算の文脈がこれなんだ。自分の中では Unit Type って呼んでた。
Avatar
koher 23-Feb-18 02:56 AM
↓こういうのがあるといいのかも https://qiita.com/nushio/items/7d534a08e5c30bae32d0
事情により二日ばかし遅延評価となってしまい申し訳ありませんm( )m 次元付き計算がいかに重要か ==== 皆さん、量の計算をするうえで、単位を間違えちゃいけないよ、って教わったと思います。 180cm + 55kg = 2...
Avatar
omochimetaru 23-Feb-18 02:57 AM
durationは、2つの時間の間隔を表現するための型である。
C++のchronoパッケージもそんなのがある ratio型の値として secondsとか milliseconds って値がある。
Avatar
koher 23-Feb-18 02:58 AM
1999年、NASAの火星探査衛星マーズ・クライメート・オービターは、制御プログラムの力の単位にポンド重とニュートンが混在していたために、計画よりはるかに低い軌道に投入されてしまい、火星大気との摩擦により墜落してして失われてしまいました。
Avatar
omochimetaru 23-Feb-18 02:58 AM
アメリカの単位系のせいで事故る宇宙開発の話題いくつかありますよね
Avatar
koher 23-Feb-18 02:58 AM
単位計算のルールを型システムにエンコードできれば、コンパイル時にすべての単位エラーを検出できるはずです。
単位系じゃないけど、アポロがジンバルロックで事故りかけたみたいな話もあった気が。
Avatar
Kishikawa Katsumi 23-Feb-18 03:04 AM
ビットコインのライブラリを書いてるときに、基本的にリトルエンディアンで送受信するんだけどポート番号とか一部だけネットワークバイトオーダーが混ざってるという感じなので、Int8〜UInt64のそれぞれのリトルエンディアン型を最初作ったんだけど、変換が面倒でやめてしまった。ただ型として別になってて変換が面倒な方がたぶん良いという印象。いずれそういうふうに戻したい。
これは色々試行錯誤しながら書いてるときには邪魔だったというだけの話です。 (edited)
Avatar
omochimetaru 23-Feb-18 03:05 AM
エンディアンはシリアライズ先の型とみなせますよね
Avatar
koher 23-Feb-18 03:06 AM
なるほど。サブタイプじゃない方が良いような気持ちになってきました。 (edited)
Avatar
rintaro 23-Feb-18 03:06 AM
型の扱いは別にして、ラッパー struct を簡単に定義出来る方法が欲しいというのはわかります。
Avatar
omochimetaru 23-Feb-18 03:06 AM
エスケープとかも同じように型付けすると良いんじゃないかと時々思います (%エンコーディングとか)
Avatar
tarunon 23-Feb-18 03:06 AM
RawRepresentableはちょっと面倒ある
Avatar
koher 23-Feb-18 03:08 AM
すると enum と同じように、 struct Path: String したら、 path.rawValueString が得られるとかでいいのかも?わざわざ構文増やさなくても、↓書けばいいだけかな・・・。
struct Path { let rawValue: String }
Avatar
omochimetaru 23-Feb-18 03:09 AM
initをpublicにするためにinitを書かないといけないですね
あれ、public struct だったら自動定義のやつも public init だっけ
Avatar
koher 23-Feb-18 03:10 AM
いや、 public init の実装必須のはず。 (edited)
という意味では : String の意味はあるか?
必要性が弱すぎてとても通ると思えない・・・。
Avatar
takasek 23-Feb-18 03:58 AM
すごい乗り遅れましたが、一回だけ実行したいやつで無を生成するコードにするのって実は公式テクなんですよね https://swift.org/migration-guide-swift3/dispatch_once で検索すると出てくる
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
omochimetaru 23-Feb-18 03:59 AM
The free function dispatch_once is no longer available in Swift. In Swift, you can use lazily initialized globals or static properties and get the same thread-safety and called-once guarantees as dispatch_once provided. Example
(edited)
let myGlobal = { … global contains initialization in a call to a closure … }() _ = myGlobal // using myGlobal will invoke the initialization code only the first time it is used.
Avatar
tarunon 23-Feb-18 04:00 AM
あー
そういえばstatic letはlazyだった
Avatar
omochimetaru 23-Feb-18 04:00 AM
本当だ。因果が逆だったのか。
dispatch_once探してたけど、それがなくなったのはこれが言語機能にあるからか。
Avatar
tarunon 23-Feb-18 04:00 AM
でもこの間のは値ごとにやりたい感じだったからstatic letは使えない。
Avatar
takasek 23-Feb-18 04:04 AM
staticのletがinstanceのlazy varに当たるので、インスタンスでやりたいならlazy varで無を生成する。 自然な帰結になりましたね
Avatar
omochimetaru 23-Feb-18 04:05 AM
なるほど。
Avatar
rintaro 23-Feb-18 07:59 AM
This will generate commands to build gyb files if they're present in a Swift target. Currently, there are no customization available and the gyb compiler will be looked up in the environment variab...
Avatar
omochimetaru 23-Feb-18 07:59 AM
おおおおおおお
Avatar
koher 23-Feb-18 07:59 AM
おお!
Avatar
omochimetaru 23-Feb-18 07:59 AM
アツい
ひさびさにワイルドな話題を見た
良いのかソレw
Avatar
koher 23-Feb-18 08:00 AM
これ、 iOS でも対応してくれないと Carthage と両対応とかのときにまずそう?
Avatar
tarunon 23-Feb-18 08:02 AM
CarthageはxcodeprojのTarget走らせるだけなんで、各位中でgyb走らせればオッケーなのでは (edited)
Avatar
omochimetaru 23-Feb-18 08:03 AM
ん〜?
gybによって生成されたファイルをターゲットに入れる必要があるけど
静的に決まってるからいけるか。
実行前は真っ赤になってるxcodeprojになるね。
Avatar
tarunon 23-Feb-18 08:03 AM
いやなんか
生成済みソースコードは最初から入れておく感じになるのでは (edited)
Avatar
omochimetaru 23-Feb-18 08:04 AM
自動生成が対応するのであれば、生成物はコミットしたくないけどなあ
Avatar
tarunon 23-Feb-18 08:04 AM
それは理想的にはそうなんだが、まあ結局全部入れてる
なんか前にその手の話した時に、
あーーー
Avatar
omochimetaru 23-Feb-18 08:05 AM
このPRによって理想に近づくってはなしかと
Avatar
tarunon 23-Feb-18 08:05 AM
それはspmが対応してないから入れなしゃーないなって感じだった
Avatar
omochimetaru 23-Feb-18 08:05 AM
おもったのだ
そうそう。
Avatar
tarunon 23-Feb-18 08:05 AM
spm対応したらコミットせんでええな
Avatar
omochimetaru 23-Feb-18 08:05 AM
そこが解決するわけでしょ。 (edited)
Avatar
tarunon 23-Feb-18 08:05 AM
ええやん
Avatar
omochimetaru 23-Feb-18 08:05 AM
うむ
Avatar
tarunon 23-Feb-18 08:05 AM
でもそこまでやるんだったらこう
もうちょっとgybを見える場所においてくれというお気持ち
Avatar
rintaro 23-Feb-18 08:06 AM
ま、
I am not sure if this is something we should actually land.
なんで、とりあえず作ってみた、的な。
Avatar
omochimetaru 23-Feb-18 08:07 AM
ハート付けといた
Avatar
norio_nomura 27-Feb-18 12:16 AM
ObjectEncoderにJSONEncoderJSONDecoder互換のクラスを追加してみた。 https://github.com/norio-nomura/ObjectEncoder/pull/18
stdlibで使われてるKeyStragety以外のテストは通る。
Avatar
norio_nomura 27-Feb-18 12:25 AM
任意の型にStrategyを設定できるObjectEncoderの機能を利用して、JSONSerializationへ渡す/から受け取るobjectをエンコード/デコードしてる。
Avatar
lovee 27-Feb-18 01:41 AM
そういえば昨日のPre try!Swiftで @tarunon さんと話しましたけど、この記事の classの場合 のコードがうごくのはおかしいよねっとw https://qiita.com/noppefoxwolf/items/a9d2a103d54b2b1ea415
Avatar
koher 27-Feb-18 01:45 AM
これ関連で最近思ってるんですが、 class でも self を書き換え可能な mutating func がほしいなぁと感じてます。
Avatar
rintaro 27-Feb-18 01:46 AM
これ extension の init は通ってないんじゃないかな。
Avatar
lovee 27-Feb-18 01:46 AM
今それやりたいなら static func で違う Self 返すしかないですね
@rintaro それがなぜかビルド通ってしかもちゃんと動くんですよ、なぜか
Avatar
koher 27-Feb-18 01:47 AM
イミュータブルクラス Foo に対して
func update(foo: Foo, ...) -> Foo { ... }
class Foo { func update(...) -> Foo { ... } }
があって、
(edited)
var foo = ... foo = update(foo: foo, ...) foo = foo.update(...)
と書くのを
Avatar
rintaro 27-Feb-18 01:49 AM
class User: Initializable { var id: Int = 1000 /* 暗黙の */ init() {} } extension Initializable { init() { self = Factory.make(type: Self.self) } } User()
で、暗黙の User.init() に直接ディスパッチされていると思います。
(edited)
Avatar
koher 27-Feb-18 01:49 AM
func update(foo: inout Foo, ...) { ... }
のように inout にして
update(foo: &foo, ...)
はできるけど、 mutating func がないので対応するメソッド版 update を作れないです。
mutating funcselfinout に持つ関数という文脈で)
Avatar
lovee 27-Feb-18 01:50 AM
スレッド機能欲しいw
Avatar
koher 27-Feb-18 01:50 AM
すみません、チャネル分けるべきでしたw
Avatar
lovee 27-Feb-18 01:55 AM
@rintaro そうですね、そして Accountid の初期値をなくすと、それもそのままコンパイルできちゃってStackOverflowになります
Avatar
rintaro 27-Feb-18 01:56 AM
Account の暗黙init が init(id: Int) になるので Initializable.init()Factory.make(type:) で無限再帰ですね。
Avatar
lovee 27-Feb-18 01:56 AM
そしてそのままPlaygroundで動かすと下手するとXcode強制終了させないとMacが固まる危険性がw
ですね
Avatar
tarunon 27-Feb-18 02:00 AM
昨日議論したのは、Factory.makeが、Initializable.initを呼ぶときに、witnesstable無いのに具体型のinit引っ張ってくるのがおもろいねという話
Avatar
lovee 27-Feb-18 02:00 AM
ところが確かに読み直してみるとそもそも Factory.make が呼ばれてなかったことに気づく
Avatar
tarunon 27-Feb-18 02:00 AM
もしかしてprotocol extensionに生えてるだけのfuncでもwitnesstable作られるようになった?昔はそこの挙動に差があって、おもちとワイワイやった記憶
ああ、そういうことか
Avatar
rintaro 27-Feb-18 02:01 AM
Initializable.initを呼ぶときに、witnesstable無いのに具体型のinit引っ張ってくる
ということでは無い。ということです。
Avatar
tarunon 27-Feb-18 02:01 AM
じゃあそもそもそこが勘違いなので全体的に正しい
Avatar
lovee 27-Feb-18 02:01 AM
まあそれはそうとして、昨日初めて @tarunon さんの実在が確認できてよかったです(おい
Avatar
tarunon 27-Feb-18 02:01 AM
想定通りの動きですね。コンパイラもこの手の無限ループ検知はしんどいから
非実在説。まあ今度のtry!で皆さん確認できますよw
Avatar
omochimetaru 27-Feb-18 02:15 AM
読んできた
謎フローに見えるけどそもそも普通のinitになっただけ?
Avatar
tarunon 27-Feb-18 02:16 AM
User.initだと暗黙宣言されたinitの方が強いからそっちを使う
Avatar
omochimetaru 27-Feb-18 02:16 AM
あー、protocol側にはinitの宣言が無くて、真の型が見えてるパターンだから、そうなのかな
Avatar
tarunon 27-Feb-18 02:16 AM
Protocol側をpublicにして、ライブラリの外からinitすると死ぬパターンとか色々作れるよ
Avatar
omochimetaru 27-Feb-18 02:29 AM
これ元記事にはツッコミ入れた方が良いのでは
筆者が誤認してると思う
Avatar
lovee 27-Feb-18 02:46 AM
業務が落ち着いたら追記します
Avatar
lovee 27-Feb-18 03:37 AM
追記しときますた
Avatar
omochimetaru 27-Feb-18 03:38 AM
クレジットどうもw
Avatar
koher 27-Feb-18 03:46 AM
@tarunon さん、 @rintaro さんと @omochimetaru さんと議論して
パワーワードだw
Avatar
lovee 27-Feb-18 03:49 AM
日本のiOS界隈四天王の3人が揃った感じですね(嘘w
🙃 1
🤔 1
🐸 1
Avatar
tarunon 27-Feb-18 05:45 AM
メンツからどこで議論されたのかが容易に割れるのが草
Avatar
rintaro 27-Feb-18 09:31 AM
https://github.com/apple/swift/pull/11869 お、無限再帰検知のPRがマージされた。限定的かもしれないけど、嬉しい機能追加。
Add a new warning that detects when a function will call itself recursively on all code paths. Attempts to invoke functions like this may cause unbounded stack growth at least or undefined behavio...
👀 1
😆 1
Avatar
tarunon 27-Feb-18 09:32 AM
↑のがバレるようになるかしら
Avatar
omochimetaru 27-Feb-18 09:32 AM
気になってたやつだ
↑のinitのややこしいやつもちゃんと動くかな
動くはずなのに無限ループだと間違ってエラーになるのが一番困るねw
Avatar
rintaro 27-Feb-18 10:00 AM
これでも検知できなかった 😢 。直接の自己再帰だけかな?
func bar() { foo() } func foo() { bar() }
(edited)
Avatar
tarunon 27-Feb-18 10:00 AM
ありゃー
Avatar
omochimetaru 27-Feb-18 10:00 AM
前見たときは相互再帰は対応してないよってテストケースのコメントに書いてあった。
Avatar
rintaro 27-Feb-18 10:01 AM
どっちか片方に @_transparent つけると、先に展開されてからの検知になるので、警告してくれましたが。
Avatar
tarunon 27-Feb-18 10:02 AM
おお
Avatar
omochimetaru 27-Feb-18 10:02 AM
おもしろい
Avatar
lovee 27-Feb-18 10:03 AM
それが検出できないってことは多分これもできないんじゃないですかね?
func generate() -> UInt32 { let a = arc4random_uniform(10) if a > 10 { return a } else { return generate() } }
Avatar
omochimetaru 27-Feb-18 10:04 AM
それはarc4randomの仕様知識が必要だからかなり厳しいね、せめて↓の形でないと
func generate() -> UInt32 { let a = arc4random() % 10 if a > 10 { return a } else { return generate() } }
Avatar
lovee 27-Feb-18 10:08 AM
ですね
やはりビルド時の無限再帰検出は難しいですね
Avatar
tarunon 27-Feb-18 10:10 AM
あんまりやりすぎるとビルド時間爆発しそう
Avatar
omochimetaru 27-Feb-18 10:10 AM
ObjC やC++の場合、そういうのはAnalyzeビルドの時だけよね
Avatar
tarunon 27-Feb-18 10:10 AM
あった
ObjCの時あったな、便利だった
Avatar
norio_nomura 01-Mar-18 10:23 AM
4.1の次は5.0ではなく4.2なのか。 https://swift.org/blog/4-2-release-process/
This post describes the goals, release process, and estimated schedule for Swift 4.2.
Avatar
Takuro Mizobe 04-Mar-18 11:19 AM
@omochimetaru これってなんでgit submodule使ってないのかな? >これら複数のリポジトリの管理は、git submoduleなどの一般的な仕組みではなく、swiftコンパイラプロジェクトで独自に提供される管理操作用のスクリプトを用いて行います。 https://qiita.com/omochimetaru/items/fd485185bcd07c21b49f
この記事では、swiftコンパイラ開発における作業環境構築の知見を紹介します。 # リポジトリ構成 swiftコンパイラプロジェクトは、複数のリポジトリから構成されています。その中で主役となるのが[apple/swift](htt...
Avatar
omochimetaru 04-Mar-18 11:32 AM
さあー? でも、このやり方なら、llvmのバージョンとswiftのバージョンを疎結合にできて、楽そう
サブモジュールだと外側は必ずコミットしなきゃいけないからそれだけのプルリクとか必要になるし
少し古いllvmでもビルドできるのに、外側に引っ張られてチェックアウトしなきゃいけなかったら、 llvmもリビルドしなきゃいけなくて待ち時間が伸びる
Avatar
Takuro Mizobe 04-Mar-18 11:34 AM
なるほど
Avatar
norio_nomura 07-Mar-18 07:04 AM
なぜambiguousなのだろう?
$ swift Welcome to Apple Swift version 4.1 (swiftlang-902.0.43 clang-902.0.37.1). Type :help for assistance. 1> Optional(1).map(dump) error: repl.swift:1:17: error: ambiguous reference to member 'dump(_:to:name:indent:maxDepth:maxItems:)' Optional(1).map(dump) ^~~~
(edited)
Avatar
tarunon 07-Mar-18 07:05 AM
dump関数って
1引数関数じゃなくて、n引数関数で幾つかがデフォルト
Avatar
norio_nomura 07-Mar-18 07:05 AM
1> :type lookup dump @discardableResult @_inlineable @_semantics("optimize.sil.specialize.generic.never") func dump<T>(_ value: T, name: Swift.String? = default, indent: Swift.Int = default, maxDepth: Swift.Int = default, maxItems: Swift.Int = default) -> T @discardableResult @_inlineable @_semantics("optimize.sil.specialize.generic.never") func dump<T, TargetStream>(_ value: T, to target: inout TargetStream, name: Swift.String? = default, indent: Swift.Int = default, maxDepth: Swift.Int = default, maxItems: Swift.Int = default) -> T where TargetStream : TextOutputStream
Avatar
tarunon 07-Mar-18 07:06 AM
今ってクロージャに関数を渡すタイミングでデフォルト引数を埋めた関数オブジェクトを生成、みたいなことは出来ないんですよね
mapが要求するのは1引数関数なのでダメ
Avatar
norio_nomura 07-Mar-18 07:06 AM
デフォルト未設定なパラメータの数って見てくれないんだっけ?
Avatar
tarunon 07-Mar-18 07:06 AM
駄目です
Avatar
omochimetaru 07-Mar-18 07:06 AM
なるほど。
Avatar
norio_nomura 07-Mar-18 07:06 AM
なるほど。
Avatar
omochimetaru 07-Mar-18 07:06 AM
{ }でつつんで$0を渡すなら
埋まるよね
Avatar
tarunon 07-Mar-18 07:06 AM
そうそう
関数オブジェクト生成時に足りないパラメータを渡す~みたいなのはない
Avatar
omochimetaru 07-Mar-18 07:07 AM
じゃあ { } で包まないオシャレ記法はデフォルト引数に頼ってる時は駄目なんだなあ
Avatar
tarunon 07-Mar-18 07:07 AM
オシャレ記法、やろうと思えば出来ないことはないんだけど
そういうのって#lineとか使っててマクロがないSwiftでは詰む
あれ?できないか、ごめん嘘付いた
Avatar
norio_nomura 07-Mar-18 07:11 AM
Playgroundのissueナビゲータには"Found this candidate (swift.dump)"ってのが2つ並ぶので「どちらか決定できない」的なエラーなのかと勘違いしたけど、そもそもどちらも使えないのか。 (edited)
Avatar
tarunon 07-Mar-18 07:11 AM
嘘っぽい
なんかその辺のエラーメッセージ嘘があった気がする
あでも複数あるのは本当ですね
Avatar
norio_nomura 07-Mar-18 07:13 AM
そう。
Avatar
tarunon 07-Mar-18 07:15 AM
とりあえずdumpをオレオレで高階関数化して、デフォルト引数を先に埋めてTの1引数関数を生成するようにすれば
func dump<T>(name: String?=nil, indent: Int=0, maxDepth: Int=0, maxItems: Int=0) -> (T) -> Void { return { value in dump(value, name: name, indent: indent, maxDepth: maxDepth, maxItems: maxItems) } } (Int?.none).map(dump())
やりたいことは出来るようになるっす
このindentとかどうやって取ってきてるんだろ (edited)
Avatar
Kishikawa Katsumi 07-Mar-18 07:17 AM
再帰的に呼ぶ時に+1するんじゃないですかね。内部で。
🙆 1
Avatar
tarunon 07-Mar-18 07:17 AM
これ似たようなテクを使うとGenerics関数を関数オブジェクトとして取り出すみたいな事ができる
例えばArray.mapは関数オブジェクトとして取り回せないけど…
Avatar
omochimetaru 07-Mar-18 07:19 AM
任意の関数 f(a, b, c, d) に対して 好きな引数を埋めた関数を得る操作があると便利か?
Avatar
tarunon 07-Mar-18 07:19 AM
デフォルト引数の扱いが関数毎に違うので一般化は出来ないと思う
extension Array { func mapSpecialized<U>(_ type: U.Type=U.self) -> ((Element) -> U) -> [U] { return { self.map($0) } } }
こういうの作るとmapを取り回せるようになる
なんかArray.mapはrethrowsが悪さしてる気がしてきた。まあそれはおいといて
こんな感じのコード書いて悪さをしてるとXcodeがよく死ぬ
Avatar
koher 08-Mar-18 03:27 AM
Swift ↓ちゃんとできてるなぁ。
var a = [2, 3, 5] var b = a a.withUnsafeMutableBufferPointer { $0.baseAddress!.pointee = -1 } print(a) // [-1, 3, 5] print(b) // [2, 3, 5]
var a = [2, 3, 5] var b = a a.withUnsafeBufferPointer { UnsafeMutablePointer(mutating: $0.baseAddress!).pointee = -1 } print(a) // [-1, 3, 5] print(b) // [-1, 3, 5]
一瞬前者でも CoW が働かないんじゃないかと思ってヒヤッとした。 (edited)
Avatar
omochimetaru 08-Mar-18 03:28 AM
前者はwith...Mutable... で、 後者は with... だからか。
Avatar
t.ae 08-Mar-18 03:29 AM
withUnsafeMutable~~は実行した瞬間コピーされてるんですかね? 中身で書き換えるかどうかまで判断してたら相当賢そうですけど
Avatar
omochimetaru 08-Mar-18 03:29 AM
瞬間コピーでしょう
CoWはそもそもそういうもの
Avatar
koher 08-Mar-18 03:29 AM
中身書き換えるところは無理じゃないかな。ポインタ経由だから。
Avatar
omochimetaru 08-Mar-18 03:29 AM
mutatingな関数の冒頭でuniqueでなければclone
Avatar
koher 08-Mar-18 03:30 AM
書き換えないなら withUnsafeBufferPointer 使えばいいわけだし問題はなさそう。
Avatar
t.ae 08-Mar-18 03:31 AM
まぁそうですよねぇ
前に自前Array書いた時書き換え判断できたら凄そうだなと思ったので
Avatar
omochimetaru 08-Mar-18 03:32 AM
要素ごとの比較だから計算量がでかくなりますよ
non-uniqueならclone、は、カウンタ見るだけだからO(1)
Avatar
t.ae 08-Mar-18 03:33 AM
ああ、もちろん実行時に必要が出て初めてコピーできたら です
Avatar
omochimetaru 08-Mar-18 03:34 AM
ポインタじゃなくてgetter/setterを渡すインターフェースならできますね。
Avatar
koher 08-Mar-18 03:52 AM
UnsafeMutablePointerpointee に参照型のインスタンス set するとリファレンスカウント増える??増えないと思ってた。
extension Array { mutating func update(_ body: (inout Element) throws -> ()) rethrows { let count = self.count try withUnsafeMutableBufferPointer { var pointer = $0.baseAddress! for _ in 0..<count { try body(&pointer.pointee) pointer += 1 } } } } class Cat { let name: String init(_ name: String) { self.name = name } deinit { print("deinit: \(name)") } } var a = [Cat("a"), Cat("b"), Cat("c")] a.update { $0 = Cat("\($0.name)2") }
deinit: a deinit: b deinit: c
Avatar
omochimetaru 08-Mar-18 03:53 AM
増えますよ
増えないとやばくて
もともと入ってる値が消えることを考えるとわかりやすいかと。
そっちはreleaseされないといけないですよね。
Avatar
koher 08-Mar-18 03:54 AM
はい。なので参照型入れるときは明示的に色々やんなきゃいけないのかと思ってた。
UnsafeRawPointer としてコピーとかすると壊れるのか。
Avatar
omochimetaru 08-Mar-18 03:55 AM
そうですね
Avatar
koher 08-Mar-18 03:57 AM
そうすると↑の update は問題なさそうだけど、これより速い実装ってあるかな?
Avatar
omochimetaru 08-Mar-18 04:00 AM
改善点は思いつかないです
Avatar
koher 08-Mar-18 04:02 AM
最初、 count が無駄かと思ってポインタを比較してループ回してたけど
計測したら↑の方が速かった。
Avatar
norio_nomura 08-Mar-18 04:02 AM
DispatchQueue.concurrentPerformを使ったconcurrentUpdateとか。
Avatar
koher 08-Mar-18 04:03 AM
↓みたいな感じ。
extension Array { mutating func update(_ body: (inout Element) throws -> ()) rethrows { let count = self.count try withUnsafeMutableBufferPointer { var pointer = $0.baseAddress! let end = pointer + count while pointer != end { try body(&pointer.pointee) pointer += 1 } } } }
@norio_nomura なるほど。でも Dispatch に依存したくないですねぇ。。。 < concurrentUpdate (edited)
いや、違うのかな。↑はインデックス操作がなくなってるところがポイントだけど、 concurrent だとそれができない?それでも並行になると速くなりそうだけど。
領域を N 分割すれば並行でもポインタ操作でできるか。 (edited)
Avatar
rintaro 08-Mar-18 04:14 AM
議論を見ていて思ったのですが、 getBase() ..< getBase() + countgetBase() 一回で綺麗に書く構文って現状ありましたっけ?
for pointer in $0.baseAddress! ..< $0.baseAddress! + count { try body(&pointer.pointee) }
をもっと短く書きたい。
Avatar
omochimetaru 08-Mar-18 04:22 AM
string[string.index(string.startIndex, offsetBy: 3) ..< string.index(string.startIndex, offestBy: 6)]
これも短く書きたい
(edited)
Avatar
Kishikawa Katsumi 08-Mar-18 04:22 AM
わかる
まあ現状そうなってる理由も納得できるけど
Avatar
rintaro 08-Mar-18 04:23 AM
string[offset: 3..<6] の議論はどんな感じなんだっけな。
Avatar
omochimetaru 08-Mar-18 04:25 AM
ありましたねそのスレ、現状の理由とかスルーしてとりあえず気持ちが書いてある感じがしたから流したけど、発展したかな
Avatar
rintaro 08-Mar-18 04:26 AM
This seems like another case that would be well served by an operator ..<+ hack: infix operator ..<+ extension Strideable { static func ..<+ (lhs: Self, rhs: Stride) -> Range { return lhs..
Avatar
koher 08-Mar-18 04:28 AM
..<+ 良さそう。
$0.baseAddress! ..< $0.baseAddress! + count できるの知らなかったー😣
Avatar
takasek 08-Mar-18 04:36 AM
今まったく同じ ..<+ 書いてた…
🙃 1
The objection is going to be: 5..< +10 which means something else.
なるほど
Avatar
t.ae 08-Mar-18 04:43 AM
似たケースで+じゃなくて-の問題を変な回避法してたのを思い出した。 https://github.com/t-ae/ndarray/blob/master/Sources/NDArray/Core/Indexing.swift#L75-L102
ndarray - Float NDArray library for Swift, accelerated with Accelerate Framework
Avatar
koher 08-Mar-18 04:47 AM
なんかすごい演算子がいっぱいだ・・・
infix operator ~> : StridePrecedence prefix operator ~> infix operator ~>- : StridePrecedence prefix operator ~>- infix operator ...~> infix operator ...~>-
Avatar
t.ae 08-Mar-18 04:48 AM
このへんが笑いどころ
public func ~>-(range: CountableRange<Int>, stride: Int) -> NDArrayIndexElement { return range ~> (-stride) }
Avatar
omochimetaru 08-Mar-18 04:49 AM
a~>-ba ~> (-b) なのね
Avatar
rintaro 08-Mar-18 04:49 AM
operator の上書きが出来ることを初めて知った。 ~> は stdlib で既に定義されているので、
Avatar
omochimetaru 08-Mar-18 04:50 AM
マジ
Avatar
t.ae 08-Mar-18 04:50 AM
あれ?別であるんですね。
Avatar
norio_nomura 08-Mar-18 11:53 PM
大喜利みたいだ>Shorthand for Offsetting startIndex and endIndex https://forums.swift.org/t/shorthand-for-offsetting-startindex-and-endindex/9397/172 (edited)
If we’re going to start using symbols, then clearly this is a job for emoji. I recommend arr[🔜(1)..<🔚(2)]. Like @DeFrenZ, I don’t understand this desire to avoid words, which everyone understands.
😆 1
Avatar
lovee 09-Mar-18 02:41 AM
XcodeもSlackとかみたいに :soon: 入れると勝手に 🔜 出してくれるようになって欲しい(嘘 (edited)
Avatar
omochimetaru 09-Mar-18 02:45 AM
このスレ2/1からなのに170もレスあるのか・・・
Avatar
lovee 09-Mar-18 05:06 AM
今日のAfter talks用のサンプル(クソ)アプリ作ったので皆さん遊んでみようぜw https://github.com/el-hoshino/zundoko brewで入れられるので、こんな感じでインストールできます:
brew tap el-hoshino/zundoko brew install zundoko
そして使い方は zundoko の後に適当に何か英文章書きます、何が出力されるかはEnter押してからのお楽しみw
zundoko try! Swift is Good
zundoko - A joke program that outputs random words from your command arguments each at a time. If eventually it output the words in the correct order, it will output the sentence again adding ! a...
Avatar
hironytic 09-Mar-18 05:32 AM
4ワードは長いw
↑今日、めっちゃ仕事が忙しいので、さっそくbrewでインストールしてみましたw
Avatar
lovee 09-Mar-18 05:57 AM
ww
まあ長い文だとものすごい実行時間長いですね、仕方ないですw
Avatar
t.ae 09-Mar-18 08:49 AM
sil出したい時いつもswiftc --emit-silと書いてしまう
Avatar
omochimetaru 09-Mar-18 09:11 AM
ハイフンが一個多いってこと?
Avatar
Biacco42 09-Mar-18 09:13 AM
java -version さんパターンだ
Avatar
t.ae 09-Mar-18 09:35 AM
それです。
javaのバージョンを調べたいことは一生に何度もないので問題ないんですが
Avatar
Biacco42 09-Mar-18 09:36 AM
環境ガチャガチャしてると時々調べたくなってキレてる
😇 1
java 9 でついに邪悪なのが --version になるよみたいな話を観た気がしてウキウキして java 9 いれて --version してそんなオプションネーヨと言われた気持ち
java 1
Avatar
tarunon 09-Mar-18 09:44 AM
ここでJava邪悪というのは卑怯なのでTwitterでやろう
Avatar
Biacco42 09-Mar-18 09:45 AM
はい
にしてもなんで swiftc も 1 個ハイフンにしちゃったんだろ
Avatar
norio_nomura 11-Mar-18 12:53 AM
KillSequence - A proposal to do away with Swift's Sequence protocol
Avatar
omochimetaru 11-Mar-18 01:06 AM
うーん、よくわからなかった
シングルパスと無限長を言ってるけど、最小の定義がそれだと思うし、 Collectionがあるんだから困る時はそっち使えば良いし・・・
Avatar
norio_nomura 11-Mar-18 01:12 AM
なんとなく気持ちが悪いのはわかる気がするけど、どうなってると今より良いのか?はわからないな。
Avatar
lovee 12-Mar-18 05:15 AM
do try 文だとネストが深くなるから、guard try let error {as XxxError} 文欲しくなった今日の今頃
Avatar
Kishikawa Katsumi 12-Mar-18 05:17 AM
それはtryの処理はdo tryとネストのレベル一緒じゃないんですか?
Avatar
omochimetaru 12-Mar-18 05:17 AM
どういう挙動?
Avatar
lovee 12-Mar-18 05:18 AM
単純に guard try? else と同じような挙動で、guard と同じ階層で正常系を描く処理ですね、ただ guard try?error を消すけどこちらは消さない
Avatar
tarunon 12-Mar-18 05:19 AM
1個関数作ったら解決しそう
Avatar
omochimetaru 12-Mar-18 05:19 AM
Xxxエラーの場合、else節でそれをハンドルして脱出 他のエラーの場合throwが飛んで行く か
Avatar
lovee 12-Mar-18 05:19 AM
guard let player = try AVAudioPlayer(name: name) catch let error as NSError { print(error) // エラーハンドリング return } catch let error { return } player.play()
みたいな
(edited)
1個関数作ったら解決しそう
確かに…? 🤔
Avatar
Kishikawa Katsumi 12-Mar-18 05:21 AM
do { try ... } catch { print(error) // エラーハンドリング return }
Avatar
tarunon 12-Mar-18 05:21 AM
Voidで握りつぶすのはあんまり好きな感じではないんですが、型を変えたErrorを投げるパターンならなんとかなりそう
Avatar
Kishikawa Katsumi 12-Mar-18 05:21 AM
^ これとあまり変わらない気がするんですよね。
Avatar
lovee 12-Mar-18 05:21 AM
要は do の中で書くとネストが深くなるのがちょっと微妙に嫌ですね
Avatar
rintaro 12-Mar-18 05:23 AM
Hello dear Swift community, this proposal might seem like some new syntax sugar, but it also aims to escape the 'do { }' scope from the 'do try catch‘ mechanism while making the existing error handling more powerful. Lets assume we have some ...
Guard statements interact with pattern-matching to ensure that control flow cannot continue unless a pattern is matched. This is a very convenient way to introduce non-optional variables from optional-valued expressions:     // func foo() ...
Avatar
lovee 12-Mar-18 05:23 AM
おおそういう議論上がってるんですね!
Avatar
Kishikawa Katsumi 12-Mar-18 05:26 AM
Adrianさんのいうcatchしたあとは早期脱出を強制させられるというメリットは少し理解できる。 (edited)
Avatar
lovee 12-Mar-18 05:29 AM
理論上は guard let Type = Type?guard let Type = try Type も同じようなものだと思うんですよね、どちらも「確実な Type が欲しい」というわけで
Avatar
lovee 12-Mar-18 05:37 AM
https://forums.swift.org/t/guard-catch/6264/6 これ良さそうですね
Amazing proposal, I love it and thinking back there's plenty of times where I would have used the guard-catch instead of the non-swifty (to me) do-catch. A guard-catch construct still allows to handle errors explicitly, with the added convenience...
Avatar
Kishikawa Katsumi 12-Mar-18 05:39 AM
この提案はまさに @lovee さんの欲してるものそのままって感じですね。
ネストを嫌ってるところも。
Avatar
lovee 12-Mar-18 05:40 AM
ですね、個人的には是非通って欲しいです
Avatar
rintaro 12-Mar-18 05:40 AM
議論止まっているので何らかアクション起こさないと動かないと思いますよ。
Avatar
lovee 12-Mar-18 05:43 AM
つまりReplyすべき、と
Avatar
rintaro 12-Mar-18 05:43 AM
むしろ Proposal と実装まで行ってしまいましょうYO!
Avatar
lovee 12-Mar-18 05:45 AM
Proposal自体は上がってるのではないんですか?この場合 🤔
マージ?されてないけど
Avatar
rintaro 12-Mar-18 05:47 AM
一度上がったことはありますが、review 前に reject されています。 https://github.com/apple/swift-evolution/pull/734
This pull request adds a proposal for a guard/catch construct for the language. It would allow code to use throwing functions and handle errors fully, without straying from a happy path. do/catch c...
あとこれ、 Parse, TypeChecker, SILGen まで影響与えるので、現時点で実装者見つけるのは厳しいかもしれないですね。
Avatar
lovee 12-Mar-18 05:48 AM
ふむふむ、ProposalはImplementationがないからRejectされた、という感じですねコメント読む限り
(つまりImplementがあればワンチャンあると 💪
Avatar
tarunon 12-Mar-18 05:49 AM
ParseからSILGenまで通しでやるのアツい
Avatar
lovee 12-Mar-18 05:49 AM
あとこれ、 Parse, TypeChecker, SILGen まで影響与えるので、現時点で実装者見つけるのは厳しいかもしれないですね。
厳しそうですね
Avatar
rintaro 12-Mar-18 05:53 AM
https://forums.swift.org/t/guard-catch/6264 現状の最新議論はこれでした。
I’d like to propose a guard/catch construct to the language. It would allow code to use throwing functions and handle errors fully, without straying from a happy path. do/catch can be a bit heavy-handed sometimes, and it would be nice to be abl...
Avatar
lovee 12-Mar-18 06:05 AM
あのリジェクトされたProposalのPRを出した人のですね
Avatar
hiragram 13-Mar-18 12:39 AM
A really cool "hidden" feature of UserDefaults is that it contains any arguments that were passed to the app at launch! 🚀 Super useful both in Swift command line tools & scripts, but also to temporarily override a value when debugging iOS ...
Likes
171
しらなかった。
Avatar
Avatar
hiragram 13-Mar-18 12:42 AM
さすがだw
Avatar
Kishikawa Katsumi 13-Mar-18 12:42 AM
^ これね。Cocoaの起動時引数は恐ろしいほど複雑な処理をしている。
たかだか起動時引数でPlist, XMLをParseするとか(悪い意味で)頭おかしいんじゃないかと思っている。
😆 1
Avatar
hironytic 13-Mar-18 12:44 AM
「悪い意味で」w
Avatar
Kishikawa Katsumi 13-Mar-18 01:12 AM
いやあ、この仕様は明らかに無駄に複雑で、便利は便利なんだけどそれだったら1種類のフォーマットを受け付けておけば良いはずで、 -plistArg '{"foo" = bar; "array" = ("foo", {"bar" = "baz"; } ); }'-xmlArg "<dict><key>foo</key><string>bar </string><key>baz</key><string>qux</string></dict>" をフォーマットを事前に指定することもなく、両方使えるようにするとか普通に考えておかしいなあと。
まあでも引数をUserDefaultsに食わせるだけみたいな実際の実装は意外とシンプルなのかな。 (edited)
Avatar
norio_nomura 13-Mar-18 01:44 AM
swift-corelibs-foundation - The Foundation Project, providing core utilities, internationalization, and OS independence
Avatar
hironytic 13-Mar-18 01:46 AM
とりあえずPropertyListSerializationに丸投げしているんですね。
Avatar
Kishikawa Katsumi 13-Mar-18 01:47 AM
実際に行われることは複雑だけどその部分に限って言えばシンプルで必要最小限のコードですね。
Avatar
norio_nomura 13-Mar-18 01:48 AM
実際(Darwin)の実装はswiftではないと思いますが、大きくは違わないと思います。 (edited)
Avatar
Kishikawa Katsumi 13-Mar-18 01:49 AM
そうでしょうね。その形で実装するのが普通だと思います。
これを調べてる過程で勘違いしたのは、ProcessInfoで取れる起動時の引数とUserDefaultsに渡されるのものはそもそも互いに独立なので、不完全なPlistを渡した場合はUserDefaultsにはもちろん渡らないのだけど、起動時引数としては普通に取れる。
調べてる最中に起動時引数が意図せず失われるんじゃないか、とか色々考えてしまった。
Avatar
kateinoigakukun 13-Mar-18 09:57 AM
protocol HasCodingKeys: Codable {} extension HasCodingKeys { func encode(to encoder: Encoder) throws { fatalError() } init(from decoder: Decoder) throws { fatalError() } } struct A: HasCodingKeys { private typealias Keys = CodingKeys // Use of undeclared type 'CodingKeys' }
Codableinit(from decoder: Decoder)func encode(to encoder: Encoder) をprotocol extensionに実装すると、Aの中でCodingKeys がundeclaredになるんですが、どういう仕組みになってるんですかね。
(edited)
Avatar
omochimetaru 13-Mar-18 09:59 AM
普通のinitとfuncだったら大丈夫なんだっけ。
Avatar
kateinoigakukun 13-Mar-18 10:07 AM
あ、proto extension 関係ないか
initとfunc両方実装されている時に使えない
Avatar
omochimetaru 13-Mar-18 10:08 AM
ふむ
Avatar
Avatar
tarunon 13-Mar-18 10:38 AM
struct A: HasCodingKeys { typealias Keys = CodingKey }
通ったよ。タイポでは
Avatar
kateinoigakukun 13-Mar-18 10:44 AM
struct A: Codable { struct B {} let b: B typealias Keys = CodingKeys }
これを通したかったみたいでした。
(edited)
そりゃ無理だ
Avatar
omochimetaru 13-Mar-18 10:46 AM
CondingKeyとCondingKeysわからなくなる
Avatar
kateinoigakukun 13-Mar-18 10:47 AM
XMLをパースするのにCodingKeyを無理やり使おうみたいなことをしていて、ハマりました。 https://github.com/kateinoigakukun/IBLinter/blob/812f9ccb34323df3fb4d5240c4f24dc8156e0a59/Sources/IBLinterCore/Models/Controllers/ViewController.swift
IBLinter - A linter tool for Interface Builder
Avatar
norio_nomura 15-Mar-18 01:08 AM
プロパティのセッタだけ@available(*, unavailable)って出来ない?
Avatar
t.ae 15-Mar-18 01:08 AM
できなかった気がしますね
外側に付けたら怒られますけど内側につけても何も言われず実行できますね
Avatar
norio_nomura 15-Mar-18 01:10 AM
ありがとうございます。
Avatar
Avatar
t.ae 15-Mar-18 01:39 AM
setterだけじゃなくgetterの場合もなんですよね。 以前subscriptsetterだけ定義したくて試してだめだったので
var _x: Int = 0 var x: Int { @available(*, unavailable) get { return _x } @available(*, unavailable) set { _x = newValue } } print(x) // 0 x = 100 print(_x) // 100
(edited)
Avatar
norio_nomura 15-Mar-18 01:42 AM
それは@availableだけの話では無いですよね。private(get)も無いから。
Avatar
t.ae 15-Mar-18 01:43 AM
確かに
Avatar
t.ae 15-Mar-18 01:52 AM
セッタのアクセスレベルがゲッタより低くしか設定できないとは明文化されてるんですけど具体的な根拠はあるんですかね。 現状で見えてる変数ライクなものが読み取れないパターンが無いのでそういうルールになっているんじゃないかという気もしますが。
Avatar
norio_nomura 15-Mar-18 02:01 AM
ゲッタが無くても構わないものは、subscriptやプロパティである必要がない、ってことなのではないかと思います。 (edited)
Avatar
lovee 15-Mar-18 02:03 AM
そうですね、多分みなさんこんな風にやってるんじゃなかと
private var privateValue = 0 func setValue(_ value: Int) { privateValue = value }
現実世界で言うといわゆる投函ボックスみたいな書き込み権限オンリーのアクセス権欲しい時 is よくある
Avatar
t.ae 15-Mar-18 02:04 AM
読み出しと書き込みで別の型を使いたいとかたしかそんなシチュエーションだった気がする
Avatar
lovee 15-Mar-18 02:06 AM
それもありそうですね、外にはパブリックな型で暴露してるけど内部処理ではもうちょっと高度なプライベートな型で処理したいときとか 🤔
Avatar
rintaro 15-Mar-18 02:07 AM
https://github.com/apple/swift/pull/15102 deprecated は実装されそう。 (edited)
This handles the case where just one accessor is deprecated but not the other, which does come up sometimes in Apple's frameworks. Not included in this pull request: fixing availability checki...
❤ 1
セッタのアクセスレベルがゲッタより低くしか設定できないとは明文化されてるんですけど具体的な根拠はあるんですかね。
foo.bar.baz = 1 で、foo の getter の方が絞られていると bar がそもそも取り出せないので、変な感じになってくるとかはありそうですね。
(edited)
Avatar
t.ae 15-Mar-18 02:13 AM
それですね。setHogehoge(~)があってgetHogehoge()がないのはそこまで違和感を覚えない
Avatar
tarunon 15-Mar-18 02:13 AM
readonly readwriteはあるけどwriteonlyがないのと同じっぽい
というか書き込み専用はそれ実質1引数Functionだから、普通にFunctionとして書いて良いんじゃないかなとか思ったり (edited)
Avatar
norio_nomura 18-Mar-18 05:42 AM
累乗関数が欲しくて、パフォーマンスをチェックしてた。
import XCTest @testable import pow let lhs = 10 let rhs = 10 let count = 1000000 let expect = Int(pow(Double(lhs), Double(rhs))) final class powTests: XCTestCase { func test0() { var x: Int = 0 measure { for _ in 0..<count { x = power0(lhs, rhs) } } XCTAssertEqual(x, expect) } …
ここでexpectの算出に使ってるInt(pow(Double(lhs), Double(rhs)))の速度も測ろうと考え
func test_() { var x: Int = 0 measure { for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) } } XCTAssertEqual(x, expect) }
を追加したら、10000倍くらい速かった。
しかしこれはコンパイラが賢くて、x = expectに書き換えてただけだった…コンパイル時に定数になってた。 (edited)
Avatar
koher 18-Mar-18 08:54 AM
コンパイラは pow が参照等価であることをどうやって知ってるんですか?
Avatar
norio_nomura 18-Mar-18 10:09 AM
同じファイルのグローバルスコープにlet expect = Int(pow(Double(lhs), Double(rhs)))ってのがあって、テストtest_()内でそのexpectを参照してるのと、Int(pow(Double(lhs), Double(rhs)を別モジュールの関数にした場合と速度差がありすぎることから、x = expectにしているという僕の推測です。 (edited)
test_()内のループカウンタをどれだけ増やしても実行時間が変わらないので、ループ自体が無くなってるのかも?
Avatar
rintaro 18-Mar-18 10:15 AM
swift のベンチマークでは、
@inline(never) public func blackHole<T>(_ x: T) {}
に食わせて、最適化を防いでますね。
measure { for _ in 0..<count { blackHole(Int(pow(Double(lhs), Double(rhs)))) } }
あー、けど x = expect になってるんだったら blackHole(expect) になるだけだから防げないか。 (edited)
Avatar
norio_nomura 18-Mar-18 10:31 AM
echo 'import Foundation; let lhs = 10, rhs = 9, count = 10000000, expect = Int(pow(Double(lhs), Double(rhs))); func test() { var x: Int = 0; for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) }; print(x == expect) }; test()'|swiftc -emit-assembly - -O|xcrun swift-demangle
(edited)
どうやらpowの呼び出し自体がなくなってるぽい。
-Ononeにするとcallq _powが2箇所現れる。
x = expectにしてるわけでは無く、コンパイル時に定数になってるぽい。
movq $10, _main.lhs : Swift.Int(%rip) movq $9, _main.rhs : Swift.Int(%rip) movq $10000000, _main.count : Swift.Int(%rip) movq $1000000000, _main.expect : Swift.Int(%rip) callq _main.test() -> ()
(edited)
そりゃ速いわ。
Avatar
norio_nomura 18-Mar-18 10:58 AM
SILの時点ではpowの呼び出しが残ってる。
Avatar
rintaro 18-Mar-18 11:04 AM
LLVM IR の時点で llvm intrinsic の @llvm.pow.f64 に置き変えですか? (edited)
Avatar
norio_nomura 18-Mar-18 11:06 AM
-emit-irpowは無くなって定数1000000000になってますね。
define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr #0 { entry: store i64 10, i64* getelementptr inbounds (%TSi, %TSi* @main.lhs : Swift.Int, i64 0, i32 0), align 8 store i64 9, i64* getelementptr inbounds (%TSi, %TSi* @main.rhs : Swift.Int, i64 0, i32 0), align 8 store i64 10000000, i64* getelementptr inbounds (%TSi, %TSi* @main.count : Swift.Int, i64 0, i32 0), align 8 store i64 1000000000, i64* getelementptr inbounds (%TSi, %TSi* @main.expect : Swift.Int, i64 0, i32 0), align 8 tail call swiftcc void @main.test() -> ()() ret i32 0 }
Avatar
rintaro 18-Mar-18 11:11 AM
ああ、 emit-ir はLLVM最適化後でした。 https://twitter.com/rintaro/status/963754184494350336
@orga_chem @omochimetaru Optimizationパス通した後の出力なので、最適化済みだと思いますよ。 https://t.co/1wx2exme0d
-disable-llvm-optzns をフロントエンドに渡してあげると見えるかもしれない。
Avatar
norio_nomura 18-Mar-18 11:19 AM
$ echo 'import Foundation; let lhs = 10, rhs = 9, count = 10000000, expect = Int(pow(Double(lhs), Double(rhs))); func test() { var x: Int = 0; for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) }; print(x == expect) }; test()'|swiftc -frontend -emit-ir -primary-file - -target x86_64-apple-darwin17.4.0 -enable-objc-interop -sdk /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk -O -color-diagnostics -disable-llvm-optzns -module-name main -o - |xcrun swift-demangle
Avatar
rintaro 18-Mar-18 11:20 AM
$ echo 'import Foundation; let lhs = 10, rhs = 9, count = 10000000, expect = Int(pow(Double(lhs), Double(rhs))); func test() { var x: Int = 0; for _ in 0..<count { x = Int(pow(Double(lhs), Double(rhs))) }; print(x == expect) }; test()' | swiftc -O -emit-ir -Xfrontend -disable-llvm-optzns -
Avatar
norio_nomura 18-Mar-18 11:20 AM
define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* store i64 10, i64* getelementptr inbounds (%TSi, %TSi* @main.lhs : Swift.Int, i32 0, i32 0), align 8 store i64 9, i64* getelementptr inbounds (%TSi, %TSi* @main.rhs : Swift.Int, i32 0, i32 0), align 8 store i64 10000000, i64* getelementptr inbounds (%TSi, %TSi* @main.count : Swift.Int, i32 0, i32 0), align 8 %3 = call double @pow(double 1.000000e+01, double 9.000000e+00)
pow残ってる。
Avatar
rintaro 18-Mar-18 11:21 AM
define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* store i64 10, i64* getelementptr inbounds (%TSi, %TSi* @_T04main3lhsSivp, i32 0, i32 0), align 8 store i64 9, i64* getelementptr inbounds (%TSi, %TSi* @_T04main3rhsSivp, i32 0, i32 0), align 8 store i64 10000000, i64* getelementptr inbounds (%TSi, %TSi* @_T04main5countSivp, i32 0, i32 0), align 8 %3 = call double @pow(double 1.000000e+01, double 9.000000e+00) %4 = bitcast double %3 to i64 ... declare double @pow(double, double) #1
この時点ではまだ 普通のpowですね。
Avatar
norio_nomura 18-Mar-18 11:56 AM
ちなみに僕の用途では、最適化で定数化されないpowは単純なforループ版より3~9倍遅かった。
Avatar
koher 18-Mar-18 04:22 PM
@norio_nomura
x = expect にしているという僕の推測です。
関数を同じ引数で複数回呼び出したときに同じ結果が返されるとは限らないので、 pow が参照等価であることをコンパイラが知らないと x = expect とすることができないんじゃないかと思ったんですが、そもそもコンパイル時に展開されているということは pow が特別扱いされてそうですね。
Avatar
norio_nomura 18-Mar-18 11:59 PM
llvmはそういう情報を持っている様です。 https://github.com/apple/swift-llvm/blob/stable/include/llvm/Analysis/ConstantFolding.h#L140-L142
/// canConstantFoldCallTo - Return true if its even possible to fold a call to /// the specified function. bool canConstantFoldCallTo(ImmutableCallSite CS, const Function *F);
Contribute to swift-llvm development by creating an account on GitHub.
Contribute to swift-llvm development by creating an account on GitHub.
Constant folding and constant propagation are related compiler optimizations used by many modern compilers. An advanced form of constant propagation known as sparse conditional constant propagation can more accurately propagate constants and simu...
Avatar
koher 30-Mar-18 02:23 AM
switch のパターンマッチに ? 使えるの知らなかった😇 if case let だけかと思ってた。
let a: Int? = 42 switch a { case let x?: print(x + 1) // 43 default: print("nil") }
Avatar
omochimetaru 30-Mar-18 02:24 AM
そういうケースはよく .some(let x) って書いてた。
Avatar
koher 30-Mar-18 02:24 AM
うん、ずっと .some(let x) にしてた。
Avatar
tarunon 30-Mar-18 02:24 AM
後置letになってる👀
Avatar
omochimetaru 30-Mar-18 02:25 AM
xcode補完に流されている・・・
Avatar
koher 30-Mar-18 02:25 AM
以前の rintaro さんの意見を聞いて以来、後置派になりました。
Avatar
omochimetaru 30-Mar-18 02:27 AM
x?. の時は ?. だけど x?: の時は x? : なのが紛らわしいな。
: は演算子には使えない文字なんだっけ。
Avatar
Aryzae 30-Mar-18 02:27 AM
switch (open, close) { case (let open?, let close?): return "\(open)〜\(close)" case (let open?, nil): return "\(open)〜" case (nil, let close?): return "〜\(close)" case (nil, nil): return "" }
最近こんなん書いたけど、?ついてるからややこしいなーと
(edited)
Avatar
koher 30-Mar-18 02:28 AM
たしかに .some の方が可読性高い?
Avatar
omochimetaru 30-Mar-18 02:28 AM
慣れの問題かもしれんけど見づらいな
Avatar
koher 30-Mar-18 02:29 AM
? ついてると一瞬脳が Optional と認識してしまいそうかも?
でも if case let a? = aOrNil はうまい表現だと思うんだよなぁ。宣言しているのはあくまで a? が剥がされてる感が。
本当は Optional Binding も if let a? = aOrNil にしてほしい。
Avatar
Aryzae 30-Mar-18 02:33 AM
Optionalの変数2つをnil or someでパターン網羅したい場合は、if文だとひたすらelse ifでかかなきゃならない?
Avatar
omochimetaru 30-Mar-18 02:34 AM
網羅する時はswitchのほうがええでしょうね、網羅性チェックも効くし。
Avatar
Aryzae 30-Mar-18 02:34 AM
だよね
Avatar
omochimetaru 30-Mar-18 02:35 AM
if case の1行表記が欲しい
1行というか式になるやつ。
Avatar
koher 30-Mar-18 02:40 AM
Bool で結果を得たいということ?
Avatar
omochimetaru 30-Mar-18 02:40 AM
一番多いのは
enum Animal { case cat(Cat) case dog ... }
↑で animal: Animal から Cat? を取り出したい
(edited)
現状だと1行で書こうとしても↓これだけかかる run { if case .cat(let x) = animal { return x } else { return nil } } (edited)
Avatar
koher 30-Mar-18 02:43 AM
Cat? を取り出しても、大抵のケースでは結局その後で分岐することになるのでは?
button.isEnabled = ... みたいなときに Bool がほしいのはある気がする。
Avatar
omochimetaru 30-Mar-18 02:44 AM
例えばそれを Observable<Animal> から Observable<Cat>` に変換する時とかにほしいんですよ
Array<Animal> から Array<Cat> に compactMap するとかでもいいですね。
Avatar
koher 30-Mar-18 02:49 AM
うーん、それは switchif case して return するしかなさそうだなぁ。 (edited)
Avatar
omochimetaru 30-Mar-18 02:50 AM
I wanted to circle back to this comment from @Joe_Groff: Has there been any recent discussion about this? I’d love for enums to be a bit more ergonomic via optional-chaining. Key path support would be a nice, free bonus! I can imagine it work...
enum個別のケースとしては今議論されてる
マッチング式は今のところ気配が無いけどとりあえずこれが来るとニーズの一つは解消するので助かる
スレかなり伸びてるなあ
Avatar
taketo1024 31-Mar-18 03:50 AM
conditional conformance は struct に対してだけで protocol に対しては使えないんですね。
conditional conformance を public にしようとすると 'public' modifier cannot be used with extensions that declare protocol conformances と言われるんですが、なぜそうなってるんでしょう?(でも外からはちゃんと認識されてるっぽい)
とりあえず多項式環が、係数が体のときにユークリッド環型になるというのができました👍
extension Polynomial: EuclideanRing where R: Field {
👍 1
Avatar
koher 31-Mar-18 04:02 AM
conditionalかに限らずprotocolに制約の後付けはできないはずですね。 https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-via-protocol-extensions
swift - The Swift Programming Language
Avatar
tarunon 31-Mar-18 04:03 AM
仮にprotocolに制約の後付けができるようになるとしたら、それはexistentialに対して行う操作になるのでは (edited)
Avatar
taketo1024 31-Mar-18 04:05 AM
ふむふむ
Avatar
omochimetaru 31-Mar-18 04:05 AM
掛け算ができるやつを多項式にすると、余り付き割り算ができるやつが、書けたのか
Avatar
taketo1024 31-Mar-18 04:10 AM
そうです!
Avatar
omochimetaru 31-Mar-18 04:10 AM
プロトコルに後付けするんじゃなくて、 絞ったwhere付きのプロトコルを別名で定義するのがやりたい事?
Avatar
taketo1024 31-Mar-18 04:11 AM
今まではそのために係数が割り算ができることを要請しないといけなかったので、整数係数多項式ができなかったんです👍(とても嬉しい)
protocol に対してもできるのかとナイーブに考えてて、できなかったので「あ、できないのか」と思った感想を呟きましたw
public にできないのは何故なのか素朴に気になります。
Avatar
omochimetaru 31-Mar-18 04:12 AM
あー、プロトコルに対して書いておくと、それに合致するときに満たしてるやつらが自動的に満たすってかきたいのか
Avatar
taketo1024 31-Mar-18 04:13 AM
はい
抽象論として環をイデアルというもので割るとまた環ができるのですが、このイデアルが「極大イデアル」だと体になるというのがあって、それを書こうとしてできなかったですw
例えば整数全体を 12 の倍数で割ると時計のような環ができるのですが、割る数が 3 とか 5 とかの素数だと(対応するイデアルが極大になって)割り算もできる体になるんです。
これをプロトコルのレベルでやろうとしたのですが、できなかったです😂
Avatar
omochimetaru 31-Mar-18 04:16 AM
あっ、なんかそれやったことある気がする・・・素数だとうまいことズレて重ならなくて・・・みたいな
👍 1
うーんそうか基本的にプロトコル準拠はノミナルな型に対して明示的に定義される形になるのか
Avatar
tarunon 31-Mar-18 04:18 AM
protocolを定義する時に protocol Collection: Sequence みたいに書くのとはまた違う感じでしょうか?
Avatar
omochimetaru 31-Mar-18 04:18 AM
例えばOptionalとArrayの、中身がEquatableなときにそれ自体もEquatableであるやつとか、 個別に書かないといけない
Avatar
tarunon 31-Mar-18 04:19 AM
あー
一般には出来ないわけか
Ok
Avatar
omochimetaru 31-Mar-18 04:19 AM
両方のモナドに対して、集合をたたみこむ特性をプロトコル化して、一気に共通定義するみたいなことを
😃 1
タケトさんの発想だとできるが、 現仕様だとできなそう
Avatar
taketo1024 31-Mar-18 04:20 AM
あ、ですです。
Avatar
tarunon 31-Mar-18 04:21 AM
subprotocol作ってassoctypeがあるならそこに制約入れて…みたいな感じを逐一やっていくしかないですね
Avatar
taketo1024 31-Mar-18 04:21 AM
なるほどなるほど。
Avatar
omochimetaru 31-Mar-18 04:24 AM
ジェネリックマニフェストには将来的トピックとして書いてあるのかな? 考えたことないテーマだったけど理解不足で取りこぼしてるかも
直感的にはそれを許しちゃうと言語の柔軟性にユーザーの頭がついていかない気はする
IDEが良きに説明してくれたらいいんかな。
Avatar
tarunon 31-Mar-18 04:25 AM
なんか直感的には出来ない気がしてきたけどまだちゃんとわからん
Avatar
omochimetaru 31-Mar-18 04:26 AM
cc @ukitaka
Avatar
taketo1024 31-Mar-18 04:33 AM
ふむふむ、とりあえず僕がやりたかったことは subprotocol を作る方法で行けそうです。ありがとうございます😆 (edited)
Avatar
taketo1024 31-Mar-18 04:46 AM
確かに protocol を自由に拡張できちゃうとめちゃくちゃになりそうですね。
Avatar
tarunon 31-Mar-18 05:11 AM
protocolのconform自体はできないけど、同じ名前の関数生やしておけば定義だけすれば使える、という感じにはなりそう
Avatar
Kuniwak 01-Apr-18 10:04 AM
既出かもしれませんが、エイプリルフールプロポーザル出てますねw https://github.com/CodaFi/swift-evolution/blob/3571229e07a03d8e3a037224267fe6525ff33ed1/proposals/NNNN-lolcode-literals.md
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 01-Apr-18 02:23 PM
LOLCODEの文法やばw
Avatar
kateinoigakukun 02-Apr-18 02:24 AM
@swiftbot
func bar(foo: int) { func inner(arg: int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 02-Apr-18 02:24 AM
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
/usercode/main.swift:1:15: error: use of undeclared type 'int' func bar(foo: int) { ^~~ /usercode/main.swift:2:21: error: use of undeclared type 'int' func inner(arg: int = foo) {} ^~~
Avatar
kateinoigakukun 02-Apr-18 02:25 AM
@swiftbot
func bar(foo: Int) { func inner(arg: Int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 02-Apr-18 02:25 AM
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
swift: /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/lib/SILGen/SILGenGlobalVariable.cpp:64: bool isGlobalLazilyInitialized(swift::VarDecl *): Assertion `!var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. /usr/bin/swift[0x3f24d54] /usr/bin/swift[0x3f25096] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f15d2b98390] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38)[0x7f15d12d7428] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16a)[0x7f15d12d902a] /lib/x86_64-linux-gnu/libc.so.6(+0x2dbd7)[0x7f15d12cfbd7] /lib/x86_64-linux-gnu/libc.so.6(+0x2dc82)[0x7f15d12cfc82] /usr/bin/swift[0xc929db] /usr/bin/swift[0xc6a1e3] /usr/bin/swift[0xc6af00] /usr/bin/swift[0xc7448c] /usr/bin/swift[0xc69ee4] /usr/bin/swift[0xcc47f6] /usr/bin/swift[0xc91f8d] /usr/bin/swift[0xc2e86b] /usr/bin/swift[0xc2c51b] /usr/bin/swift[0xc2b847] /usr/bin/swift[0xcc1225] /usr/bin/swift[0xcc106e] /usr/bin/swift[0xc8fec5] /usr/bin/swift[0xc33515] /usr/bin/swift[0xc2ba85] /usr/bin/swift[0xc30f7b] /usr/bin/swift[0xc31c46] /usr/bin/swift[0xc3221d] /usr/bin/swift[0x4c27c4] /usr/bin/swift[0x4beecc] /usr/bin/swift[0x4778c4] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f15d12c2830] /usr/bin/swift[0x475179] Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret /usercode/main.swift -disable-objc-interop -module-name main 1. While emitting SIL for 'bar(foo:)' at /usercode/main.swift:1:1 2. While silgen emitFunction SIL function "@_T04main3barySi3foo_tF". for 'bar(foo:)' at /usercode/main.swift:1:1 3. While silgen emitDefaultArgGenerator SIL function "@_T04main3barySi3foo_tF5innerL_ySi3arg_tFfA_". for expression at [/usercode/main.swift:2:27 - line:2:27] RangeText="f" Aborted (core dumped)
Avatar
kateinoigakukun 02-Apr-18 02:25 AM
壊れた
Avatar
omochimetaru 02-Apr-18 02:25 AM
コンパイラこわれた
Assertion !var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. (edited)
innerのfooがローカルコンテキストではないと期待してるけど、実際には外側のbarのローカル変数だから
アサーションがこける?
Avatar
Avatar
omochimetaru 02-Apr-18 02:30 AM
bugs行きで良いと思います
Avatar
kateinoigakukun 02-Apr-18 02:31 AM
🙆
Avatar
omochimetaru 02-Apr-18 02:31 AM
その上で、そのあたりのコードを読んで、適切な修正を試みると楽しいかもしれない・・・
Avatar
kateinoigakukun 02-Apr-18 02:32 AM
楽しそう
Avatar
taketo1024 02-Apr-18 02:36 AM
conditional conformance 使ってガシガシ重複コードを削ってくと、いよいよ generic な extension が欲しくなってきますね🤓 (edited)
Avatar
tarunon 02-Apr-18 02:37 AM
条件付きでprotocolにconformするprotocolだと思う
昨日一日考えたのですが、コンパイルが終わらなくなるケースがあって難しそうだなと思いました
Avatar
omochimetaru 02-Apr-18 02:40 AM
これはできる・・・
struct Stone {} extension Stone { func aaa<T>(_ t: T) {} }
Avatar
tarunon 02-Apr-18 02:41 AM
protocol A {} protocol B {} protocol C {} extension A: B where Self: C {} extension B: C where Self: A {} extension C: A where Self: B {}
仮にできたとして、↑が解けなくなりそう
あれっ
genericなextensionになってるw
違う話かな
Avatar
omochimetaru 02-Apr-18 02:43 AM
@taketo1024 欲しい記法を詳しく教えてくださいw
Avatar
Kishikawa Katsumi 02-Apr-18 02:54 AM
@swiftbot versions
Avatar
swiftbot BOT 02-Apr-18 02:54 AM
Available Swift versions:
2018-03-31-a 4.1 4.0.3 3.1.1 3.0.2
Avatar
Kishikawa Katsumi 02-Apr-18 02:54 AM
@swiftbot —version 2018-03-31-a
func bar(foo: Int) { func inner(arg: Int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 02-Apr-18 02:54 AM
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
swift: /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/lib/SILGen/SILGenGlobalVariable.cpp:64: bool isGlobalLazilyInitialized(swift::VarDecl *): Assertion `!var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. /usr/bin/swift[0x3f24d54] /usr/bin/swift[0x3f25096] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f6befe6f390] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38)[0x7f6bee5ae428] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16a)[0x7f6bee5b002a] /lib/x86_64-linux-gnu/libc.so.6(+0x2dbd7)[0x7f6bee5a6bd7] /lib/x86_64-linux-gnu/libc.so.6(+0x2dc82)[0x7f6bee5a6c82] /usr/bin/swift[0xc929db] /usr/bin/swift[0xc6a1e3] /usr/bin/swift[0xc6af00] /usr/bin/swift[0xc7448c] /usr/bin/swift[0xc69ee4] /usr/bin/swift[0xcc47f6] /usr/bin/swift[0xc91f8d] /usr/bin/swift[0xc2e86b] /usr/bin/swift[0xc2c51b] /usr/bin/swift[0xc2b847] /usr/bin/swift[0xcc1225] /usr/bin/swift[0xcc106e] /usr/bin/swift[0xc8fec5] /usr/bin/swift[0xc33515] /usr/bin/swift[0xc2ba85] /usr/bin/swift[0xc30f7b] /usr/bin/swift[0xc31c46] /usr/bin/swift[0xc3221d] /usr/bin/swift[0x4c27c4] /usr/bin/swift[0x4beecc] /usr/bin/swift[0x4778c4] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f6bee599830] /usr/bin/swift[0x475179] Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret /usercode/main.swift -disable-objc-interop -module-name main 1. While emitting SIL for 'bar(foo:)' at /usercode/main.swift:1:1 2. While silgen emitFunction SIL function "@_T04main3barySi3foo_tF". for 'bar(foo:)' at /usercode/main.swift:1:1 3. While silgen emitDefaultArgGenerator SIL function "@_T04main3barySi3foo_tF5innerL_ySi3arg_tFfA_". for expression at [/usercode/main.swift:2:27 - line:2:27] RangeText="f" Aborted (core dumped)
Avatar
Kishikawa Katsumi 02-Apr-18 02:59 AM
@swiftbot --version=2018-03-31-a
func bar(foo: Int) { func inner(arg: Int = foo) {} print(inner()) } bar(foo: 3)
Avatar
swiftbot BOT 02-Apr-18 02:59 AM
Swift version 4.2-dev (LLVM 0d52728a8a, Clang 1d3cad1e6b, Swift 6c42bcccbd) Target: x86_64-unknown-linux-gnu
swift: /home/buildnode/jenkins/workspace/oss-swift-package-linux-ubuntu-16_04/swift/lib/SILGen/SILGenGlobalVariable.cpp:64: bool isGlobalLazilyInitialized(swift::VarDecl *): Assertion `!var->getDeclContext()->isLocalContext() && "not a global variable!"' failed. /usr/bin/swift[0x411c854] /usr/bin/swift[0x411cb96] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f64a8588390] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38)[0x7f64a6cc7428] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16a)[0x7f64a6cc902a] /lib/x86_64-linux-gnu/libc.so.6(+0x2dbd7)[0x7f64a6cbfbd7] /lib/x86_64-linux-gnu/libc.so.6(+0x2dc82)[0x7f64a6cbfc82] /usr/bin/swift[0xcb8bb3] /usr/bin/swift[0xc8d123] /usr/bin/swift[0xc8dde3] /usr/bin/swift[0xc9e360] /usr/bin/swift[0xc8cef4] /usr/bin/swift[0xcecb34] /usr/bin/swift[0xcb8091] /usr/bin/swift[0xc4fb59] /usr/bin/swift[0xc4d64f] /usr/bin/swift[0xc4c878] /usr/bin/swift[0xce96b5] /usr/bin/swift[0xce94fe] /usr/bin/swift[0xcb5f5b] /usr/bin/swift[0xc54c84] /usr/bin/swift[0xc4cb25] /usr/bin/swift[0xc525bb] /usr/bin/swift[0xc53266] /usr/bin/swift[0xc5385d] /usr/bin/swift[0x4d820d] /usr/bin/swift[0x4d4b9c] /usr/bin/swift[0x48a26d] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f64a6cb2830] /usr/bin/swift[0x487ac9] Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret /usercode/main.swift -disable-objc-interop -module-name main 1. While emitting SIL for 'bar(foo:)' at /usercode/main.swift:1:1 2. While silgen emitFunction SIL function "@$S4main3bar3fooySi_tF". for 'bar(foo:)' at /usercode/main.swift:1:1 3. While silgen emitDefaultArgGenerator SIL function "@$S4main3bar3fooySi_tF5innerL_3argySi_tFfA_". for expression at [/usercode/main.swift:2:27 - line:2:27] RangeText="f" Aborted (core dumped)
Avatar
Kishikawa Katsumi 02-Apr-18 03:00 AM
最新のスナップショットでも同じか。iPhoneからだとダブルハイフンがダッシュに変わってしまう。。。
Avatar
kateinoigakukun 02-Apr-18 03:01 AM
最新のスナップショットが手軽に試せるの最高ですね
Avatar
d_date 02-Apr-18 03:03 AM
そっかiPhoneからでも試せるのか…
Avatar
Kishikawa Katsumi 02-Apr-18 03:06 AM
コードを全部入れるのは大変だけど、元になるのがあればコピーペーストできるから簡単。
Avatar
koher 02-Apr-18 03:12 AM
@omochimetaru 多分↓これのことじゃない? < 欲しい記法 https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#parameterized-extensions (edited)
swift - The Swift Programming Language
Avatar
omochimetaru 02-Apr-18 03:14 AM
それっぽい
Avatar
koher 02-Apr-18 03:20 AM
これほんとにほしくて、
func foo<T>(_ array: [T?]) -> [T] { ... }
はできるのに↓ができないのは、関数よりもメソッドを優先する Swift としては明らかな言語仕様的不足。
extension<T> Array where Wrapped == T? { func foo() -> [T] { ... } }
Avatar
omochimetaru 02-Apr-18 03:21 AM
あーたしかに・・・
Avatar
Avatar
omochimetaru 02-Apr-18 03:33 AM
ワイもOptionalConvertible.swift書いてある
Avatar
koher 02-Apr-18 03:42 AM
OptionalProtocol 、昔は where T == Int? とかでも必要だったけどこれは解消してマシになったんですけど、まだ == T? が書けないんですよねぇ。
これがないから compactMap の Proposal に書かれてる compact も実装できない・・・。 https://github.com/apple/swift-evolution/blob/master/proposals/0187-introduce-filtermap.md
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
taketo1024 02-Apr-18 03:58 AM
@koher それです!!!
Parameterized extensions という名前だったんですね、適当な呼び方してしまってすいません😉
Avatar
omochimetaru 02-Apr-18 03:59 AM
↑のOptionalProtocolでのワークアラウンドみたいにすることで
taketoさんのユースケースで目的が果たせる可能性があります (edited)
Avatar
taketo1024 02-Apr-18 03:59 AM
ふむふむ?
Avatar
omochimetaru 02-Apr-18 03:59 AM
↓これは書けないけど
extension<T> Array where Element == T? { func foo() -> [T] { ... } }
(edited)
Avatar
taketo1024 02-Apr-18 04:00 AM
Wrapped は Element のことです?
Avatar
omochimetaru 02-Apr-18 04:00 AM
これは書けるので使い勝手としては同じ事ができます
extension Array where Element: OptionalConvertible { ... } extension Optional : OptionalConvertble { ... }
(edited)
あ、ですね
Avatar
taketo1024 02-Apr-18 04:01 AM
OptionalConvertble というのは?
Avatar
omochimetaru 02-Apr-18 04:02 AM
public protocol OptionalConvertible { associatedtype _Wrapped func asOptional() -> Optional<_Wrapped> } extension Optional : OptionalConvertible { public func asOptional() -> Optional<Wrapped> { return self } }
Avatar
taketo1024 02-Apr-18 04:05 AM
すいません、これが必要となるケースがあまりわかってないです🤔
Avatar
omochimetaru 02-Apr-18 04:06 AM
あとで整理しますね
Avatar
taketo1024 02-Apr-18 04:06 AM
すいません🙏
ちなみに自分がやろうとしてできなかったのは、cond. conf. + typealias でできるだけ新しく型を作るのを抑えようとしていたのですが、
public protocol EquivalenceRelation { .. } public struct QuotientSet<X, Rel: EquivalenceRelation>: SetType where X == Rel.Base { .. } public struct ModSubgroupRelation<H: Subgroup>: EquivalenceRelation { .. } public typealias QuotientGroup<G, H: Subgroup> = QuotientSet<G, ModSubgroupRelation<H>> where G == H.Super extension QuotientGroup: Group where X: Group, Rel: ModSubgroupRelation<H> // あっ
typealias するときに型を包むと、包んだ後のものについては cond. conf. が使えないということに気づいたのでした。 (edited)
抽象化するとこうなると思います:
protocol A {} struct X<T: A> {} struct B<S>: A{} typealias Y<S> = X<B<S>> extension<S> Y where T == B<S> { .. } // コレ
(edited)
generic に typealias した Y を新しい型だと思いたいのですが、そうすると extension できないという。
Avatar
koher 02-Apr-18 04:32 AM
こんな感じでしょうか?
protocol A {} struct X<T: A> {} struct B<S>: A{} typealias Y<S> = X<B<S>> protocol BProtocol: A { associatedtype _S var bValue: B<_S> { get } } extension B : BProtocol { var bValue: B<S> { return self } } extension X where T : BProtocol { // これがやりたい }
Avatar
taketo1024 02-Apr-18 04:33 AM
おぉ…😲
これが上の Optional のと同じことをしてるんですね…(まだ飲み込めてない
Avatar
koher 02-Apr-18 04:34 AM
extension<S> Y where T == B<S>extension<S> X where T == B<S> と同じ意味になると思います。
Avatar
taketo1024 02-Apr-18 04:34 AM
そうですね。
Avatar
koher 02-Apr-18 04:34 AM
さっきの Optional の話と合わせると BProtocolBConvertible とした方がよかったかもしれません。
BProtoclB に変換できるので実質的に B のように扱えます。
Avatar
taketo1024 02-Apr-18 04:36 AM
B<S> に対応する protocol を一段かませばいけるってことか!
ちとやってみます🤓👍 (edited)
🙂 1
Avatar
taketo1024 02-Apr-18 04:45 AM
public protocol _ModSubgroupRelation: EquivalenceRelation where Base == Sub.Super { associatedtype Sub: Subgroup } public struct ModSubgroupRelation<H: Subgroup>: _ModSubgroupRelation { public typealias Base = H.Super public typealias Sub = H ... } public typealias QuotientGroup<G, H: Subgroup> = QuotientSet<G, ModSubgroupRelation<H>> where G == H.Super extension QuotientGroup: Group where Rel: _ModSubgroupRelation, X == Rel.Base { ... }
できたっぽいです!
Avatar
koher 02-Apr-18 04:46 AM
おおっ😀
あ、多分 _ModSubgroupRelation プロトコルから ModSubgroupRelation を取り出すメソッドかプロパティをつけないといけないと思います。 (edited)
Avatar
taketo1024 02-Apr-18 04:56 AM
そうですね、なんか今上手く行ってないですw
あ、いや、大丈夫でした。
ModSubgroupRelation は static method を一個持ってるだけで、インスタンスとして使われることのないものです。
同値関係を型で与えて QuotientSet に埋め込むという。
しかしこの書き方が分かりやすいかは怪しい気がしてきたので、ここはいくつかで実装を分ける方向で行こうかなと思います😅アドバイスありがとうございました!
Avatar
koher 02-Apr-18 05:20 AM
@taketo1024 現状の Swift でうまく抽象化できずに類似コードを何度も書かないといけないケースでは、僕らは gyb (という Swift コンパイラでも使われている)ツールを使ってコードジェネレーションに逃げてることが多いですね😅 https://qiita.com/omochimetaru/items/422ddd04e95c55dd3833#gyb
# メタプログラミングとテンプレートエンジン プログラミングにおいて、そのプログラミング言語の機能だけではプログラムを書くのが大変だったり難しいときに、外部のツールな...
Avatar
taketo1024 02-Apr-18 05:28 AM
なるほどなるほど。
Avatar
taketo1024 02-Apr-18 06:56 AM
protocol P{} struct A<T> {} extension A: P where T == Int {} extension A: P where T == String {} // error: redundant conformance of 'A<T>' to protocol 'P'
異なる条件でも同じ protocol への conformance はできないんですね…🙍
(edited)
Avatar
tarunon 02-Apr-18 06:59 AM
それやろうとすると
protocol IntOrString {} extension Int: IntOrString {} extension String: IntOrString {} extension A: P where T: IntOrString {}
みたいに回り道が必要になりますねぇ
Avatar
taketo1024 02-Apr-18 07:00 AM
ですよね😿
Avatar
taketo1024 03-Apr-18 02:17 AM
こういうのもエラーになることが分かりました。 @swiftbot
protocol A {} protocol B: A {} protocol C: A {} protocol D: B, C {} struct X<T>: A{} extension X: D where T == Int { // Type 'X<T>' does not conform to protocol 'B' }
Avatar
swiftbot BOT 03-Apr-18 02:17 AM
Swift version 4.1 (swift-4.1-RELEASE)
/usercode/main.swift:7:1: error: type 'X<T>' does not conform to protocol 'B' extension X: D where T == Int { // Type 'X<T>' does not conform to protocol 'B' ^ /usercode/main.swift:4:10: note: type 'X<T>' does not conform to inherited protocol 'B' protocol D: B, C {} ^
Avatar
taketo1024 03-Apr-18 02:18 AM
こうしないと行けない @swiftbot
protocol A {} protocol B: A {} protocol C: A {} protocol D: B, C {} struct X<T>: A{} extension X: B where T == Int {} extension X: C where T == Int {} extension X: D where T == Int {}
Avatar
swiftbot BOT 03-Apr-18 02:18 AM
Swift version 4.1 (swift-4.1-RELEASE)
Avatar
taketo1024 03-Apr-18 02:18 AM
エラーメッセージがこれと気づきにくいので時間が溶けがち😔
D で B の要求を C を使って protocol extension で実装する、というようなことがこれだとできない☹
@swiftbot
protocol A {} protocol B: A {} protocol C: A {} protocol D: B, C {} struct X<T>: A{} extension X: B, C, D where T == Int {}
Avatar
swiftbot BOT 03-Apr-18 02:24 AM
Swift version 4.1 (swift-4.1-RELEASE)
Avatar
taketo1024 03-Apr-18 02:25 AM
これでいけることが明らかになりました😆
ちゃんと継承の順番通りに並べて書けばいいらしい。
Avatar
taketo1024 03-Apr-18 03:30 AM
だいぶ慣れて来ました👍
extension BilinearMap: VectorSpace, BilinearMapType where Domain: ProductSetType & VectorSpace, Domain.Left: VectorSpace, Domain.Right: VectorSpace, Codomain: VectorSpace, Domain.CoeffRing == Codomain.CoeffRing, Domain.CoeffRing == Domain.Left.CoeffRing, Domain.CoeffRing == Domain.Right.CoeffRing {
Avatar
koher 03-Apr-18 03:37 AM
すごい Constraints だ・・・
Avatar
taketo1024 03-Apr-18 03:42 AM
parametrized extension ができるようになればもっとシンプルに書けるんですが…w
extension <V1: VectorSpace, V2: VectorSpace, W: VectorSpace> BilinearMap: BilinearMapType where Domain == ProductVectorSpace<V1, V2>, Domain.CoeffRing == Codomain.CoeffRing { }
これで済むと思います。
🙄 1
Avatar
koher 03-Apr-18 03:43 AM
はやくサポートされてほしいですねぇ。昨日 parameterized extension がないと対応しようがない問題にぶち当たって(サポートする型を列挙しようがない)、トリッキーな方法で回避しないといけませんでした・・・。
Avatar
taketo1024 03-Apr-18 03:45 AM
誠に待ち望ましいです😂
Avatar
koher 03-Apr-18 03:46 AM
メソッドではなく関数なら問題ないので、数学なら演算子で逃げるという手もあるかもしれませんね。
Avatar
taketo1024 03-Apr-18 03:47 AM
それは結構辛い感じになりそう…
Avatar
koher 03-Apr-18 03:48 AM
extension<T> Array where Element == Optional<T> { func compact() -> Array<T> { ... } }
の代わりに
func compact<T>(_ array: Array<Optional<T>>) -> Array<T> { ... }
になりますが、関数だと記述順が辛いところを
演算子だと instance operator parameter の順に書けるのでメソッドっぽくなります。
ただ、その操作に数学で一般的な演算子の記号がないと辛いことになりそうですね😅
(一般的な演算子の記号があるならすでに演算子で実装されてますよね・・・) (edited)
Avatar
omochimetaru 03-Apr-18 03:51 AM
関数後置演算子という魔法・・・
Avatar
taketo1024 03-Apr-18 03:51 AM
読むの不可能なコードができあがりそうですw
Avatar
omochimetaru 03-Apr-18 03:51 AM
func |> (a, b) { return b(a) }
Avatar
taketo1024 03-Apr-18 03:54 AM
上の大量の constraint つきのコードビルドしたら Segmentation fault になりました 😂
😂 3
Avatar
taketo1024 03-Apr-18 04:05 AM
これが原因らしい… 🔪
public typealias BilinearForm<V: VectorSpace> = BilinearMap<V, V, AsVectorSpace<V.CoeffRing>> extension BilinearForm: BilinearFormType where Domain: ProductSetType & VectorSpace, Domain.Left: VectorSpace, Domain.Left == Domain.Right, Domain.CoeffRing == Domain.Left.CoeffRing, Codomain == AsVectorSpace<Domain.CoeffRing> { }
Avatar
koher 03-Apr-18 04:21 AM
typealias に対して extension を書かない方がいいかもしれませんね。
Avatar
taketo1024 03-Apr-18 04:22 AM
元のものに戻してもダメでした 😫
😣 1
Avatar
koher 03-Apr-18 04:25 AM
コンパイラクラッシュはなんにせよバグなので、最小際限ケースがわかればバグレポートするのがいいのですが・・・(誰かが直してくれる可能性がある)
Avatar
taketo1024 03-Apr-18 04:26 AM
SegFault の原因を探るのってどうしたらいいんでしょう?w
Contribute to SwiftyAlgebra development by creating an account on GitHub.
Avatar
koher 03-Apr-18 04:26 AM
僕は徐々にコードをシンプルにしていきながら問題が発生する限界を見極めますが、もっと良い方法があるかもしれません。
Avatar
taketo1024 03-Apr-18 04:27 AM
該当部分を消せばコンパイルが通るので、原因は確実にそれなんですが…
Avatar
koher 03-Apr-18 04:31 AM
既存プロジェクトでやると大きすぎて原因特定が大変なので、似たようなコードを単独の swift ファイルで作成し、同じ状況を作り上げるところから始めて、徐々にコードを削りながらバグが際限する最小ケースを探すという手順が良いんじゃないかと思います。
(そこまでするかどうかですが😅
Avatar
taketo1024 03-Apr-18 04:47 AM
上のはやりすぎに思えてきたので、諦めて途中段階の struct をもう一個作ることにしましたw
🙂 1
Avatar
rintaro 03-Apr-18 05:15 AM
元々特殊化された generic タイプ に対する extension は認められていないので、 typealias も extension 付けられません。
@swiftbot
class C<T> {} typealias IntC = C<Int> extension IntC {}
Avatar
swiftbot BOT 03-Apr-18 05:15 AM
Swift version 4.1 (swift-4.1-RELEASE)
/usercode/main.swift:3:1: error: constrained extension must be declared on the unspecialized generic type 'C' with constraints specified by a 'where' clause extension IntC {} ^ ~~~~
Avatar
rintaro 03-Apr-18 05:16 AM
https://bugs.swift.org/browse/SR-4875 でも generic パラメータ付きの typealias が素通りしてしまうバグがあります。
Avatar
taketo1024 03-Apr-18 05:53 AM
なるほど、バグなんですね!
素通りするから認められてるものと思っていました。
ありがとうございます🙏
Avatar
rintaro 03-Apr-18 05:55 AM
ただ、このバグは generic パラメータが無視されるだけなので、 segfault はまた別のバグですね。
Avatar
norio_nomura 05-Apr-18 02:28 AM
@swiftbot
#if swift(>=4.1.0) let version = "4.1.0" #elsif swift(>=4.0.3) // it should be `elseif` let version = "4.0.3" #endif
Avatar
swiftbot BOT 05-Apr-18 02:28 AM
Swift version 4.1 (swift-4.1-RELEASE)
/usercode/main.swift:3:9: error: expected expression #elsif swift(>=4.0.3) // it should be `elseif` ^ /usercode/main.swift:4:17: error: invalid redeclaration of 'version' let version = "4.0.3" ^ /usercode/main.swift:2:17: note: 'version' previously declared here let version = "4.1.0" ^
Avatar
norio_nomura 05-Apr-18 02:30 AM
@swiftbot --options=-swift-version 3
#if swift(>=4.1.0) let version = "4.1.0" #elsif swift(>=4.0.3) // it should be `elseif` let version = "4.0.3" #endif
Avatar
swiftbot BOT 05-Apr-18 02:30 AM
Swift version 4.1 (swift-4.1-RELEASE)
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8
Avatar
norio_nomura 05-Apr-18 02:30 AM
@swiftbot --options="-swift-version 3"
#if swift(>=4.1.0) let version = "4.1.0" #elsif swift(>=4.0.3) // it should be `elseif` let version = "4.0.3" #endif
Avatar
swiftbot BOT 05-Apr-18 02:30 AM
Swift version 4.1 (swift-4.1-RELEASE)
Avatar
norio_nomura 05-Apr-18 02:31 AM
-swift-version 3が付いた時に#elsifってのがそのまま通ってしまうぽい?
Avatar
rintaro 05-Apr-18 02:33 AM
#if から #endif の間が swift(>=4.1.0) じゃないので、パースの対象外になるので、
無視されますね。
Avatar
norio_nomura 05-Apr-18 02:34 AM
なるほど…
Avatar
t.ae 05-Apr-18 02:34 AM
手元のplaygroundsでも通りましたけどversionが参照できなかったです
Avatar
norio_nomura 05-Apr-18 02:36 AM
このtypoに気づけなくて、何か対策コードを書けないかと思ったのだけれど、難しそう。 https://github.com/realm/SwiftLint/pull/2143/commits/2ab42cdec10ae6c3ff5839d498500103a92b932c
Avatar
t.ae 05-Apr-18 02:37 AM
そのあとに_ = version書いとけば判定はできそうですね。 一般的には使えなそうですが。
Avatar
norio_nomura 05-Apr-18 02:39 AM
SourceKitへ渡すソースなので、コンパイルされない文字列なのですよね。 (edited)
😫 1
Avatar
rintaro 05-Apr-18 02:40 AM
パースの対象とするか否かを、現在の言語モードではなく、コンパイラの対応バージョンで決定するべきだ。という主張は出来ると思います。
つまり -swift-version 3 でも 4.2 対応のコンパイラなら swift(>=4.1.0)false だけども内容はパースする。
Avatar
norio_nomura 05-Apr-18 02:43 AM
その場合、canImport()とかの新しい条件が含まれてた時にエラーになったりしないですかね。
Avatar
rintaro 05-Apr-18 02:44 AM
そういうのも含めて考慮すべき点はいくつかあると思います。
Avatar
norio_nomura 05-Apr-18 02:45 AM
Swiftのドキュメントを確認しようとしたらリンク切れになってた。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html
The definitive guide to Swift, Apple’s programming language for building iOS, macOS, watchOS, and tvOS apps.
Avatar
norio_nomura 05-Apr-18 02:56 AM
つまり -swift-version 3 でも 4.2 対応のコンパイラなら swift(>=4.1.0) は false だけども内容はパースする。
コードが想定する対応バージョンのコンパイラでちゃんとテストしろ、で済んでしまう問題ではあるのですよね…
Avatar
hiragram 09-Apr-18 07:32 AM
fatalErrorとpreconditionFailureって明確なルールをもって使い分けてる方いたらどういうふうにやってるか知りたいです
Avatar
omochimetaru 09-Apr-18 07:43 AM
完全には明確じゃないけど
preconditionFailureってそもそもあんまり使わなくて
preconditionで書けるならそのほうがいいから(削除時に分岐ごと消えるカラーとして
preconditionFailure自体の使い所にあまり出会わないけど
使う場合はやっぱりそこに突入するのが事前条件違反での死の場合で (edited)
fatalErrorはそこで死ぬ事自体が関数の機能な場合に使うようにしてる
Avatar
hiragram 09-Apr-18 07:44 AM
ふむ
僕はおもちが「それは強制アンラップでいい」って言いそうなシーンでfatalErrorを使って、アプリ固有のロジック上ここにはいることはありえないみたいな時にpreconditionFailureを使うようにしてる
Avatar
omochimetaru 09-Apr-18 07:46 AM
あ、まさにそれだ
extension Optional { public func unwrap(_ message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line) -> Wrapped { guard let value = self else { let m = message() fatalError("Optional unwrap failed" + (!m.isEmpty ? ": " + m : ""), file: file, line: line) } return value }
↑今使ってるやつだけど、強制アンラップだと、ヒント情報が付けられないのが気に食わないのでこれを使ってて
これは違反時に死ぬ事自体が明確な機能だからfatalErrorで書いてるわ
Avatar
hiragram 09-Apr-18 07:47 AM
guard let tableView = tableViewController.tableView else { fatalError("UITableViewControllerじゃなくなった?") }
とか
Avatar
omochimetaru 09-Apr-18 07:47 AM
let tableView = tableViewController.tableView.unwrap("UITableViewControllerじゃなくなった?") ↑こうかいたほうがよくない?
Avatar
hiragram 09-Apr-18 07:47 AM
あまり差はなく感じる
Avatar
omochimetaru 09-Apr-18 07:47 AM
1行と3行
Avatar
hiragram 09-Apr-18 07:47 AM
これはguardであるということは主張しておきたい
って前もこんな話したなw
Avatar
omochimetaru 09-Apr-18 07:48 AM
それがノイズなんだよね
えっと、
guardであることをコードリーダーが「読むたびに」把握するべきことなのか
「問題発生時に解析可能であればいい」のか
の違いだと思ってて
一般的なguard(returnするケース)は、アプリケーションロジックだから
コードで表されたアプリケーション仕様だから、把握しておく必要があるんだけど
!とか、死ぬケースっていうのは、把握しておく必要はないはずなんだよね
なぜなら書いた時にそれが起こらない事が「検証済みなはず」で
それについてはもう忘れて良いはずだから。
で、それについて思い出すのは、テストして落ちた時でいい。
Avatar
hiragram 09-Apr-18 07:50 AM
それはそのメソッドの実装者も利用者も一人だけのときでないと無理じゃない?
Avatar
omochimetaru 09-Apr-18 07:50 AM
いや、そんなことないでしょ
「メソッドの利用者はメソッドの前提条件を知らねばならない」から。
どんな使い方のメソッドなのか理解してから使うものでしょ。
Avatar
hiragram 09-Apr-18 07:51 AM
何らかの改修があったときに機能まで検証済みだった前提が壊れてないかをチェックするのにguardキーワードはあってほしいけどなあ
Avatar
omochimetaru 09-Apr-18 07:51 AM
その前提がおけなくて、「型検査で通る呼び出しはなんでもされうる」っていうシナリオなら、まあそうだけど、それって厳しいケースがたくさん出てきそう
そういうパターンは
そもそも実行テストで洗い出さないといかんやん。
Avatar
hiragram 09-Apr-18 07:53 AM
ふむ〜
非同期処理とか絡んでくると全パターン完全に網羅するの無理だとおもうんだよなあ
Avatar
omochimetaru 09-Apr-18 07:54 AM
無理だからこそ
頭で把握しようとしても無理なので
どうせ実行テストしないといけなくて
実行テストで洗い出せるようになってれば、 コードとしては3行じゃなくて1行にすませてスッキリさせといたほうが
読みやすい分お得
みたいな。
あ、でもそもそも
!相当のクラッシュとかは、メソッド冒頭に集めてあるイメージではある
うーんまあそれは関係ないか?
Avatar
hiragram 09-Apr-18 07:56 AM
まあ早期離脱やでな
Avatar
omochimetaru 09-Apr-18 07:58 AM
fatalErrorで殺す場合を想定してる、 returnで脱出場合はguard書くよ(ってかメソッドにできないし
てかもともとの fatalError vs preconditionFailure の話でいうと、 (edited)
さっきみたいに unwrap メソッドにしちゃうと
それがprecondition的呼び出しかどうかはわからないせいで
fatalErrorになっちゃうって問題はあるんだよね
func preconditionNotNone<T>(_ t: T?) -> T
これ作ったこともある。これは内部で preconditionFailureで死ぬ。
Avatar
taketo1024 09-Apr-18 01:40 PM
四元数の掛け算の一部:
let x = a.x * b.x - a.y * b.y - a.z * b.z - a.w * b.w
が Expression was too complex... と言われて辛い😵 なぜかこうすると通るようにはなる…
let x = a.x * b.x - (a.y * b.y + a.z * b.z + a.w * b.w)
Swift3 の頃は true && true && true とかやるだけで出てた気がするのでだいぶ良くはなったんだと思いますが🙄
Avatar
Kishikawa Katsumi 09-Apr-18 01:41 PM
これは演算子のオーバーロードですかね。
Avatar
taketo1024 09-Apr-18 01:41 PM
はい、そうです。
Avatar
Kishikawa Katsumi 09-Apr-18 01:41 PM
まあ、辛さはわかります。
😥 1
Avatar
taketo1024 09-Apr-18 01:41 PM
でもここに出てくる a.x たちの型は決まってるものなので、そう複雑でもないように人間の目には見えるんですが。 (edited)
Avatar
tarunon 09-Apr-18 01:43 PM
演算子のoverloadの解決が、二要素の総当たりで型を推論して、それが重なりあったときに冪乗で計算量が増えてしまう、だった気がする
Avatar
Kishikawa Katsumi 09-Apr-18 01:43 PM
演算子は結構難しいと思うんですよね。カッコをつけたら通るというのは型もそうですけど結合順位の解決が大変なんじゃ無いですか。
Avatar
tarunon 09-Apr-18 01:43 PM
==と&&もそんな感じでおそい
Avatar
koher 09-Apr-18 01:44 PM
結合順位って演算子ごとに決まってないですっけ?
Avatar
tarunon 09-Apr-18 01:44 PM
ここがConditionalConformanceでワンチャンはやくなるのでは?と思ってるんですが試してないな (edited)
Avatar
Kishikawa Katsumi 09-Apr-18 01:44 PM
コントロールできたでしょ。
違ったっけ。
Avatar
taketo1024 09-Apr-18 01:44 PM
演算子ごとに固定だと思います(カスタム演算子は自分で設定できる)
Avatar
Kishikawa Katsumi 09-Apr-18 01:45 PM
なるほど、+ とか-は変更できないのか。
じゃあなんだろ。型なのかな。
Avatar
koher 09-Apr-18 01:46 PM
x, y, z, w の型が定まってるなら組み合わせなさそうですけどねー🤔
リテラルだと ExpressibleByXxxLiteral で組み合わせ爆発するけど(ここが Swift 特有の問題だと思ってます)、この場合はどうしてだろう・・・。 (edited)
Avatar
Avatar
koher 09-Apr-18 01:48 PM
局所的には複数の演算子にマッチし得て、式全体を通してみると一意に決定されるとか? (edited)
Avatar
taketo1024 09-Apr-18 01:49 PM
𝐑 * 𝐑 は一通りしかないはずなんですよね…
𝐑 * M みたいな感じで係数になりうるケースはあるので、その辺がマッチしちゃってるんだと思うんですが…
Avatar
koher 09-Apr-18 01:51 PM
𝐑 の正体は何者ですか? Double
Avatar
taketo1024 09-Apr-18 01:51 PM
Double を wrap した struct です。
Avatar
koher 09-Apr-18 01:51 PM
うーん、プロトコルじゃないんですね。なら一意に定まりそうですねぇ。
𝐑 * 𝐑 は一通りしかないはずなんですよね… 𝐑 * M みたいな感じで係数になりうるケースはあるので、その辺がマッチしちゃってるんだと思うんですが…
𝐑 * 𝐑 ではなく𝐑 * ? で探索始めちゃってるんですかねぇ?コンパイラの内部の挙動を確認しないとわからなさそう・・・。
Avatar
tarunon 09-Apr-18 01:53 PM
@ukitaka
型推論の優先順位を見れるのがありましたよね、あれに通すと何かわかるかも
Avatar
taketo1024 09-Apr-18 01:54 PM
おぉ、そんな機能が
Avatar
masakihori 09-Apr-18 02:01 PM
あってるかわかりませんが
public static func -(a: 𝐑, b: 𝐑) -> 𝐑 { return 𝐑(a.value - b.value, a.error + b.error) }
を付け加えたら通りました
😲 1
Avatar
taketo1024 09-Apr-18 02:01 PM
Avatar
tarunon 09-Apr-18 02:01 PM
@@
Avatar
Kishikawa Katsumi 09-Apr-18 02:04 PM
つまり、
(a.x * b.x )- (a.y * b.y) - (a.z * b.z) - (a.w * b.w)
- を探し続けてたってこと?
(edited)
ちょっと式の意味変わっちゃってるけど。
Avatar
ukitaka 09-Apr-18 02:05 PM
( もう解決してそうですが、型推論の挙動自体はswift -frontend -typecheck -debug-constraints ファイル名.swift で見れます )
Avatar
Kishikawa Katsumi 09-Apr-18 02:05 PM
こうか。
Avatar
tarunon 09-Apr-18 02:05 PM
(ukitakaくんありがとう)
Avatar
taketo1024 09-Apr-18 02:07 PM
ちなみに 2項 - は AdditiveGroup というプロトコルで + と単項 - を使ってこう定義してます:
public extension AdditiveGroup { public static func -(a: Self, b: Self) -> Self { return (a + (-b)) } }
https://github.com/taketo1024/SwiftyMath/blob/master/Sources/SwiftyMath/Abstract/AdditiveGroup.swift#L12
SwiftyMath - Pure Math in Pure Swift.
今から上の方法試してみます。
Avatar
masakihori 09-Apr-18 02:10 PM
なるほど、数学的だ
👍 1
Avatar
taketo1024 09-Apr-18 02:11 PM
おぉ、ほんとだ、通るようになった😂
でもこれは普通に通っといて欲しい笑
Avatar
masakihori 09-Apr-18 02:13 PM
zと同じように
let x = a.x * b.x + -a.y * b.y - a.z * b.z - a.w * b.w
とすると通りますね
2項の - を削除しても
Avatar
koher 09-Apr-18 02:14 PM
これって、デフォルト実装だと探索順位が変わってる(低い)ってことですか?? (edited)
Avatar
taketo1024 09-Apr-18 02:15 PM
@masakihori そうなんですよね…是非そんなへんな書き方はしたくないですw
@koher ってことなんですかねぇ…
Avatar
Kishikawa Katsumi 09-Apr-18 02:17 PM
swift -frontend -typecheck -debug-constraints って簡単なコードでもすごい大量の出力がありますね。
200MBくらいになったところで止めた。
Avatar
taketo1024 09-Apr-18 02:18 PM
えげつなく出てきますねw 僕もいま該当の部分だけのファイル作ってるとこでしたw
Avatar
koher 09-Apr-18 02:20 PM
お、際限できたかも
Avatar
Kishikawa Katsumi 09-Apr-18 02:20 PM
あ、そもそもリテラルでToo complexになるものにかけたので問題はそこです。組み合わせが大量にあって解決できないわけだから当然かと。
Avatar
koher 09-Apr-18 02:20 PM
けどもう新幹線おりなきゃ
Avatar
Kishikawa Katsumi 09-Apr-18 02:20 PM
だから普通のコードでやるぶんには大丈夫。
Avatar
koher 09-Apr-18 02:21 PM
protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self static prefix func-(value: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + -rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } static prefix func-(value: Foo) -> Foo { return value } } let a = Foo() let b = a + a - a + a - a + a - a + a
これで明示的な実装を付けたらどうなるか試したいけどもう新幹線下りるので後で・・・
Avatar
Kishikawa Katsumi 09-Apr-18 02:22 PM
@swiftbot
protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self static prefix func-(value: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + -rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } static prefix func-(value: Foo) -> Foo { return value } } let a = Foo() let b = a + a - a + a - a + a - a + a
^ このコードだけ見るとコンパイラをいじめるだけのコードにしか見えないけど、佐野さんの例を見ると、これがコンパイルできる必要があるんだなあと。
😁 1
Avatar
tarunon 09-Apr-18 02:24 PM
いじめるだけのコードw
どこかにoverloadのタネが埋まってるのかなと思ったけどそうでもないですね
Avatar
ukitaka 09-Apr-18 02:29 PM
このあたりのオーバーロードの解決を軽くする改善されてたよな〜と思ったら... いつのまにかRemove されてた 😂 https://github.com/apple/swift/pull/14581
The current implementation isn't really useful in the face of generic overloads. It has never been enabled by default, and isn't useful to keep around if it is disabled. If we ever want to ...
😇 1
Avatar
koher 09-Apr-18 02:29 PM
↓だと大丈夫でした。
protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self static prefix func-(value: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + -rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } static prefix func-(value: Foo) -> Foo { return value } } extension Foo { static func -(lhs: Foo, rhs: Foo) -> Foo { return lhs + -rhs } } let a = Foo() let b = a + a - a + a - a + a - a + a
やっぱり明示的に実装されているか、デフォルト実装かで推論の優先順位が変わってそう。
Avatar
taketo1024 09-Apr-18 02:30 PM
infix - を明示的に入れるか否かの違いってことですね🙄
Avatar
koher 09-Apr-18 02:31 PM
これって推論のバグなんじゃないのかなぁ・・・。
Avatar
taketo1024 09-Apr-18 02:31 PM
protocol extension のありがたみが… 😆
Avatar
tarunon 09-Apr-18 02:31 PM
ところで+と-で動きが違うのは
-はprefixがあるからなのかな?
Avatar
koher 09-Apr-18 02:31 PM
- はデフォルト実装だからじゃないですか?
あー、 prefix の可能性もあるのか。
Avatar
taketo1024 09-Apr-18 02:32 PM
prefix あると思います。
Avatar
tarunon 09-Apr-18 02:32 PM
SwiftyMathのほうは+もデフォ実装です
AddativeSubgroupにありますね
Avatar
koher 09-Apr-18 02:32 PM
でも prefix と解釈したらパースに失敗しそうな?
Avatar
taketo1024 09-Apr-18 02:32 PM
そうなんですよねぇ
Avatar
koher 09-Apr-18 02:33 PM
ん?? +- かどっちかは明示的な実装が必要でないですか?
Avatar
taketo1024 09-Apr-18 02:34 PM
infix + と prefix - が必要で、それを使って infix - がデフォルト実装されるようになってます。
@tarunon AdditiveSubgroup は、整数全体の中の偶数全体のように、親の演算をそのまま子供が引き継げるケースで使うやつです。
Avatar
masakihori 09-Apr-18 02:35 PM
let x = a.x * b.x - a.y * b.y - a.z * b.z// - a.w * b.w
これなら通る
Avatar
tarunon 09-Apr-18 02:36 PM
RはAddaptiveと思ってたけど見間違いかしら
Avatar
masakihori 09-Apr-18 02:37 PM
なので推論に使える「深さ」があってそれをオーバーしたのでtoo complexで諦めた?
Avatar
tarunon 09-Apr-18 02:38 PM
↑↑はあってる、で、どちらもprotocol extensionの実装
具体型のimplだと通るのはそれがoverloadで静的に見つかるからと思う、witness-tableから引いてるわけではなさそう
Avatar
taketo1024 09-Apr-18 02:40 PM
Additive というのは演算が加法的 + という意味です(のことではなく?)
加法的な演算に乗法的な演算が加わって環(Ring)というものになります。
Avatar
tarunon 09-Apr-18 02:42 PM
僕の言っているのは、+も-もinfixは全部protocol extensionの実装になっているので、この場合は+がコンパイル可能だが-は不可能、その差はprefix operatorの有無では?と言う話です。そのprotocol extensionの宣言はAddativeSubGroupが持ってますよね? (edited)
Avatar
taketo1024 09-Apr-18 02:43 PM
+ のデフォ実装は基本的にはないです、
AdditiveGroup の subprotocol に AdditiveSubgroup というのがあって、sub の方は super が演算を引き継げるようになってます。
(意図をくめてなかったらすみません🙏
Avatar
tarunon 09-Apr-18 02:47 PM
あでもRealNumberは+の定義も持ってた!
すみません、ここは僕の読めてなかったところだ
Avatar
taketo1024 09-Apr-18 02:47 PM
引き算と割り算が省略できる作りになってます。
Avatar
tarunon 09-Apr-18 02:48 PM
RealNumber > SubField > Subring > AddativeSubgroup
ここで、AddativeSubgroupはSuperの+を使えるので、それならコンパイラから見たら同じprotocol extensionじゃないかな?と思った次第
実際はちゃんと静的な定義がありました
Avatar
taketo1024 09-Apr-18 02:49 PM
あっ、確かにそうでした😵
a - b を a + -b って書き直すと通るようになったりするんで、- が infix なのか prefix なのかをコンパイラが判断できなくなってる感じがします…
Avatar
koher 09-Apr-18 02:57 PM
↓でもダメなんで、やっぱりデフォルト実装の問題だと思います。
protocol FooProtocol { static func +(lhs: Self, rhs: Self) -> Self static func -(lhs: Self, rhs: Self) -> Self } extension FooProtocol { static func -(lhs: Self, rhs: Self) -> Self { return lhs + rhs } } struct Foo : FooProtocol { static func +(lhs: Foo, rhs: Foo) -> Foo { return lhs } } let a = Foo() let b = a + a - a + a - a + a - a + a
Avatar
tarunon 09-Apr-18 02:57 PM
オッ RealNumberの+の実装外したらいろんなところが転けましたね
これはprefix関係なさそう
これで転けるとすると、、ConditionalConformanceで==と&&の組み合わせの改善は…出来てなさそうな気がしてきましたねぇ
Avatar
koher 09-Apr-18 03:02 PM
バグレポートしてみました。 https://bugs.swift.org/browse/SR-7389
👍 4
Avatar
tarunon 09-Apr-18 03:04 PM
thumbsupの隣にthumbsdownがあってドキドキしながら押すの、UXよくないですよね
(関係ない)
Avatar
Kishikawa Katsumi 09-Apr-18 03:05 PM
一度つけた絵文字って消せない。。。?
Avatar
tarunon 09-Apr-18 03:05 PM
もう一回押すと消せますけど、それでもドキドキしちゃう
Avatar
Kishikawa Katsumi 09-Apr-18 03:06 PM
あ、消せた。
まあ 👎🏻 これいらないですよね。
Avatar
tarunon 09-Apr-18 03:07 PM
サムズダウンしたら勝手にサムズアップにしてくれて、もう一度やり直すと本当にサムズダウンになる、みたいな
Avatar
Kishikawa Katsumi 09-Apr-18 03:08 PM
Botの出番か。
Avatar
tarunon 09-Apr-18 03:09 PM
あとなんか、ディスコードのよく使う絵文字、バグってるのかここ最近固まってしまって使い勝手が悪い
Avatar
Kishikawa Katsumi 09-Apr-18 03:10 PM
マジメな話、 👎🏻 いらないというのは非常に合理的だと考えていて、というのも基本的に不特定多数の集まるネットではポジティブよりネガティブなリアクションにつきやすい偏りがあるからです。
Avatar
omochimetaru 09-Apr-18 04:11 PM
prefix operatorの場合は演算子をオペランドに密着させないといけないから
そこの探索は生じないのじゃない?
Avatar
tarunon 09-Apr-18 04:12 PM
それは勘違いでした
+と-の差がprefixの有無だと初見では思っていたが、実際は静的実装の有無だった
Avatar
koher 09-Apr-18 04:12 PM
@Kishikawa Katsumi さんのコミュニケーション論とか評価論、興味深いです。iOSDC飲みのときにされてたStackOverflowが唯一評価付けに成功してるという話とか。まとめが読んでみたいです🙂
😅 1
Avatar
tarunon 09-Apr-18 04:13 PM
最初は両方ともprotocol extensionに実装があったのでそれかな?と思った。静的実装は見逃していた
Avatar
taketo1024 10-Apr-18 12:15 AM
みなさんありがとうございます!bug report にコメントもついてますね:
Operations that work on concrete types are always going to be simpler for the compiler to reason about than those involving protocols, but we'd still like to do better here.
Avatar
koher 10-Apr-18 02:44 AM
Unfortunately type-checking performance related to generics is not yet optimal (but we are working on it), because unlike for concrete types, we can't attempt bindings for arguments until all of the operator overloads are applied which leads to exponential behavior. So I would suggest for time being and if it's possible add new operator overloads only with concrete types.
うーん、解決できないわきゃないと思うんだけどなぁ。
オペランドの型が定まってるんだから。
Avatar
rintaro 10-Apr-18 03:32 AM
実プロジェクトで起きている問題だということをアピールすれば優先順位あげてもらえるかも。
Avatar
koher 10-Apr-18 03:41 AM
むしろ PR チャンス?いきなりこんなところに突っ込むと死ぬかな・・・?
😂 1
Avatar
norio_nomura 12-Apr-18 11:55 PM
setterで@availableを使える様にしてもらった。 https://bugs.swift.org/browse/SR-7201
👏 6
Avatar
hiragram 13-Apr-18 04:10 AM
アプリターゲットが別のアプリターゲットをtestable importするのってだめなんですかね
Avatar
Kishikawa Katsumi 13-Apr-18 04:11 AM
プロダクションコードでってことですよね?
Avatar
hiragram 13-Apr-18 04:11 AM
えーっと、リリースするアプリがtestable importするのではないです。
Avatar
omochimetaru 13-Apr-18 04:12 AM
そもそもアプリターゲットってリンクできるんか?
.app 形式にうまくパッケージされない気が
Avatar
hiragram 13-Apr-18 04:13 AM
「MainAppターゲットに入ってるViewControllerのインスタンスを作って、順番に画面に表示していくTestApp」を作って、TestAppのUITest+fastlaneでスクショを集めるみたいなことをしたくて。
Avatar
omochimetaru 13-Apr-18 04:14 AM
そもそも普通にライブラリとして作るのがいいんじゃない?
Avatar
hiragram 13-Apr-18 04:14 AM
TestAppのtarget dependenciesにMainAppを入れて、@testable import MainApp したらMainApp側の型がコード補完上見れるようになったところまではやった
Avatar
Kishikawa Katsumi 13-Apr-18 04:14 AM
何となくわかる。可能ならそれは別にいいと思います。
Avatar
hiragram 13-Apr-18 04:14 AM
@omochimetaru どゆこと
Avatar
omochimetaru 13-Apr-18 04:14 AM
ちゃんとpublicにしたほうがいいとおもう。
Avatar
Kishikawa Katsumi 13-Apr-18 04:14 AM
多分ダイナミックリンクではなさそう。
Avatar
omochimetaru 13-Apr-18 04:15 AM
@hiragram アプリターゲットじゃなくてFrameworkターゲットにする
Avatar
hiragram 13-Apr-18 04:15 AM
どっちを?
Avatar
omochimetaru 13-Apr-18 04:15 AM
えーっと、ぜんぶで3つになる
アプリの実質的なコード全部が入ったFrameworkと、 それをアプリとしてリリースするためのガワだけのアプリターゲットと、 それぞれの画面のスクショを撮るためのアプリターゲット。
Avatar
hiragram 13-Apr-18 04:16 AM
MainApp側が特殊なことをしたくないんだよね
MainAppはどうテストされるかとかそういうのは一切考えなくて良いようにしたい
Avatar
omochimetaru 13-Apr-18 04:16 AM
いずれにしても
testable importするんじゃなくて
例えば UserProfileViewControllerが
public classなら
普通のimportでいいじゃん?
Avatar
Kishikawa Katsumi 13-Apr-18 04:17 AM
あと現状はコンパイル通ってるのかもしれないけどうまくいかないと思いますね。
Avatar
omochimetaru 13-Apr-18 04:17 AM
僕もそれが気になってます>動くのかどうか
Avatar
Kishikawa Katsumi 13-Apr-18 04:17 AM
スクリーンショットが目的ならTestAppいらないと思います。
Avatar
omochimetaru 13-Apr-18 04:18 AM
Appのexecutableはdylibとしてリンクできないだろうしxibとかのリソース周りを含めたバンドルアセットが
パッケージできないんじゃないか・・・?
Avatar
Kishikawa Katsumi 13-Apr-18 04:18 AM
UITestのコードを書きたくないんじゃないかと思うんですけど、たぶんUITestのコードを書いた方が簡単。
Avatar
omochimetaru 13-Apr-18 04:18 AM
あ、それか普通に、MainAppの中にスクショ取るための画面を作ったら良いのでは。
一番最初のAppDelegateで最初の画面出すところとかでBundleIDとか見て分岐しちゃえば。 (edited)
あーでもそれだといろいろと2重に登録しないといけないかあ。
出荷版にスクショモードへのルーティングを含めたくないよね。
まあなんかアプリ側で持ってるデバッグスイッチとかあるだろうしそれでいいか。
Avatar
Kishikawa Katsumi 13-Apr-18 04:21 AM
MainAppと99%同じビルド構成のTestAppというターゲットを作るのがベターかな。
MainAppで分岐するより。
Avatar
omochimetaru 13-Apr-18 04:21 AM
最初そうおもったんですけど、それだとVCとかXIBとか何もかも全部ぶち込むってことですよね?
Avatar
hiragram 13-Apr-18 04:21 AM
それはちょっと
Avatar
omochimetaru 13-Apr-18 04:22 AM
元々それが嫌で最初のアイデアになってるのかなと思った。
Avatar
Kishikawa Katsumi 13-Apr-18 04:22 AM
たぶんTestAppの方はxcconfigでMainAppの構成を継承しつつ、一部Excludeで簡単にできると思います。
Avatar
omochimetaru 13-Apr-18 04:23 AM
いけそうなきもしてきた
Avatar
Kishikawa Katsumi 13-Apr-18 04:24 AM
TestAppには EXCLUDED_SOURCE_FILE_NAMES=AppDelegate.swift と書きつつ、 TestAppDelegate.swift というのだけ追加すればいいのではないかしら。 (edited)
Avatar
hiragram 13-Apr-18 04:25 AM
UITestのコードを書きたくないんじゃないかと思うんですけど、たぶんUITestのコードを書いた方が簡単。
これについては、これをやりたいんです https://qiita.com/tamaki/items/0c2ca2ee3b222321749b
先日iOSDCに個人スポンサーとして参加して来ました、いやー最高でしたね。毎年あってほしい。 非常に興味深い発表ばかりで刺激たっぷり、そこで得た知見なりを活かしたいと考え...
今のMainAppのViewControllerたちは呼び出し元から渡された値のみで動作するので、スクショ取る用のモックを差し込んだVCのインスタンスを作って、その画面を直接表示する、ということができるVCなんですが、UITest側でそれができなくてこまっているので
じゃあ1段テスト用のアプリを作ればええやん、testable importでMainApp突っ込めばアクセスできるはずやん、となった
いまの進捗としては、MyAppのinternalなViewControllerは使えた。MyAppのinternalなprotocolのメソッドなどを使おうとするとリンカエラーになって困っている、という感じです
Avatar
Kishikawa Katsumi 13-Apr-18 04:27 AM
まあその目的であれば、動くのであればTestApp側にtestable import書くのは別に問題ないと思います。
Avatar
omochimetaru 13-Apr-18 04:27 AM
使えたっていうのは、実際に画面出たの?
Avatar
hiragram 13-Apr-18 04:27 AM
使えたというのはコンパイル通せたということ
Avatar
Kishikawa Katsumi 13-Apr-18 04:28 AM
アプリに関していうとpublicとinternalはほとんど同義なので、publicにしてもいいと思います。
Avatar
omochimetaru 13-Apr-18 04:28 AM
なるほど。コンパイルはできると思うんだけど、画面出るところまでいけなさそう。
Avatar
hiragram 13-Apr-18 04:28 AM
プロトコルのメソッド経由でinstantiateするコードが含まれてるとリンカエラーになってるので、直接initよびだして作ってみようかな
それは試してないのでやります
Avatar
Kishikawa Katsumi 13-Apr-18 04:29 AM
総論でいうと、UITestはそもそもテスト対象をプログラム的に触れないのが当たり前なので、普通にUITest側でUIを操作して画面を作っていくことをお勧めします。 (edited)
Avatar
hiragram 13-Apr-18 04:29 AM
それは同意です
Avatar
omochimetaru 13-Apr-18 04:35 AM
@hiragram Qiitaの記事ざっと読んだんだけど > 「MainAppターゲットに入ってるViewControllerのインスタンスを作って、順番に画面に表示していくTestApp」を作って、TestAppのUITest+fastlaneでスクショを集めるみたいなことをしたくて。 これって一通りの画面を出す画面が、MainAppに入ってたらそれ + UITest でできない? (edited)
Avatar
Kishikawa Katsumi 13-Apr-18 04:36 AM
うん、同じイレギュラーだったらとりあえずシンプルな方法にしといたらいいと思いますよ。
Avatar
omochimetaru 13-Apr-18 04:36 AM
MainApp + TestApp + UITest(snapshot) じゃなくて MainApp + UITest(snapshot) にする。
その場合の問題点はMainAppに「画面を並べた画面」の実装が入っちゃうことだけど、 Qiita記事みたいに起動オプションでAppDelegateでルーティングするなら、本番リリースではそのパラメータが来ても無視するように別途設定機能をもっといて封印したら良いと思う。 (edited)
Avatar
Kishikawa Katsumi 13-Apr-18 04:38 AM
それかUITestじゃなくてUnitTestで、ビューを画像にレンダリングした方がいいんじゃないかな。。。?
let viewController = ... let window = UIWindow() window.backgroundColor = .white window.rootViewController = viewController window.makeKeyAndVisible() RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) viewController.view.layer.render()
^ みたいなことをした方が簡単。
Avatar
omochimetaru 13-Apr-18 04:42 AM
あ〜
HostAppのあるUnitTestって結局プロセス内だからUIWindowつくってmakeKeyAndVisibleできるのか。
😀 1
Avatar
Kishikawa Katsumi 13-Apr-18 04:46 AM
^ のやり方で、プレーンなViewControllerとNavController, TabBarControllerにそれぞれEmbedした場合で適切にcontentInsetsが設定されているか、などを確認しているのが https://github.com/kishikawakatsumi/SpreadsheetView/blob/master/Framework/Tests/ViewTests.swift <= このテストケースで、参考になるんじゃないかな。
SpreadsheetView - Full configurable spreadsheet view user interfaces for iOS applications. With this framework, you can easily create complex layouts like schedule, gantt chart or timetable as if y...
Avatar
omochimetaru 13-Apr-18 04:48 AM
SpreadsheetView - Full configurable spreadsheet view user interfaces for iOS applications. With this framework, you can easily create complex layouts like schedule, gantt chart or timetable as if y...
お〜 このテクニックおもしろい
Avatar
Kishikawa Katsumi 13-Apr-18 04:49 AM
動かすとよく分かりますよ^^
Avatar
tamaki 13-Apr-18 04:52 AM
ios-snapshot-test-case - Snapshot view unit tests for iOS
Avatar
hiragram 13-Apr-18 04:52 AM
これって一通りの画面を出す画面が、MainAppに入ってたらそれ + UITest でできない?
テスト用のモックもそっちに置かなきゃいけないのはなんかいや
Avatar
omochimetaru 13-Apr-18 04:52 AM
そう・・・
アプリにデバッグメニューとか作ってないの?
Avatar
hiragram 13-Apr-18 04:52 AM
まだないお
Avatar
omochimetaru 13-Apr-18 04:53 AM
俺はよくいろんな画面にいける画面とかAPI叩いたり内部データ書き換える画面作ってるから
どうせそういうのがあるならいいじゃんって思った。
Avatar
Kishikawa Katsumi 13-Apr-18 04:53 AM
iOSSnapshotTestCaseを使うと、ビューを画像にする部分がより簡単になります。
Avatar
omochimetaru 13-Apr-18 04:54 AM
こんなライブラリあるのか
iOSSnapshotTestCase (previously named FBSnapshotTestCase)
もともとFacebookなの・・・?
uber/ だけど・・・
Avatar
Kishikawa Katsumi 13-Apr-18 04:54 AM
もともとFacebookが作っててDiscontinuedになってUberに引き継がれた。
Avatar
omochimetaru 13-Apr-18 04:55 AM
へぇ〜〜
Avatar
Kishikawa Katsumi 13-Apr-18 04:55 AM
AsyncDisplayKit => Textureも似たような感じ。
Facebook => Pinterest(だったかな?)
Avatar
tamaki 13-Apr-18 04:55 AM
ですです。 snapshottestcase好きで使ってたんですがFBがやめてしまって暫くどうしよっかなと思ってたらいつの間にかUberが引き取ってました (edited)
Avatar
omochimetaru 13-Apr-18 04:56 AM
ほ〜〜
Avatar
tamaki 13-Apr-18 11:07 AM
これ使うと差分検出のためにリファレンスの画像が必要になるんですが、それによってPRに変更箇所の画像も含まれるようになるので副次的効果としてレビューしやすくなるのも気に入ってます。一旦FBがアーカイブしたタイミングでXCUITestでスクショ取る方法に移してたんですがUberが引き継いだならやっぱこっちに戻そうかなとか最近考えてます。
Avatar
norio_nomura 15-Apr-18 11:00 AM
Swiftコンパイラボットを作成する過程で、Processで起動した子プロセスの出力をキャプチャする際にはDispatchGroupで待つと良いという知見を得た。 https://github.com/norio-nomura/SwiftCompilerDiscordappBot/blob/master/Sources/SwiftCompilerDiscordappBot/execute().swift#L27-L31
SwiftCompilerDiscordappBot - Swift Compiler Discordapp Bot
パイプが64KB以上バッファしてくれないので、親側でパイプから逐次読み出さないでいると、子プロセスからの出力が64KBを越えた時点でパイプへの書き込み待ちになり、子プロセスが終了しなくなる。
なので、プロセス終了待ちと標準出力受け取りと標準エラー受け取りを全部並列で実行する必要がある。
Avatar
tarunon 16-Apr-18 04:12 AM
Conditional Conformance使ってObjcDelegateに一部のGenericsのときだけConformしようとしたらコンパイル出来なかった
👀 1
Avatar
Kishikawa Katsumi 17-Apr-18 02:35 AM
Avatar
omochimetaru 17-Apr-18 02:36 AM
fuckingってわりに内容は使い方解説?
Avatar
Kishikawa Katsumi 17-Apr-18 02:37 AM
これはいわゆるツンデレってやつですね。
🤔 1
Avatar
omochimetaru 17-Apr-18 02:37 AM
なあるほど。
これな〜 式にしたいことが多いんだよなあ。
Avatar
tarunon 17-Apr-18 02:38 AM
ifcase、補完出てこなくて辛いのでswitchcasedefaultやりがち
Avatar
Kishikawa Katsumi 17-Apr-18 02:39 AM
f○cking~.com シリーズはたぶん4つ目くらい。たぶん初代は f○cking block syntax. 初代をリスペクトしつつ、いろんな人がわざわざドメインとって作ってるっぽい。 (edited)
Avatar
lovee 17-Apr-18 02:56 AM
f*ckingではないが https://www.wtfautolayout.com もありましたね
Make sense of cryptic Auto Layout error logs.
Avatar
t.ae 17-Apr-18 02:57 AM
Why The Failure...
Avatar
Kishikawa Katsumi 17-Apr-18 02:57 AM
普通に便利なやつ。
Avatar
omochimetaru 17-Apr-18 02:58 AM
うおすげえw
これアドレス見比べてヘロヘロになるんだわこれは便利
Avatar
shtnkgm 18-Apr-18 03:00 PM
UITableViewCellやUICollectionViewCellでコンストラクタDIを行いたい場合ってみなさんどうされていますか? 通常はdequeueReusableCell(withReuseIdentifier:for:)でインスタンス化を行うため、そもそもコンストラクタのカスタマイズはできないものなのでしょうか?
Avatar
tarunon 19-Apr-18 01:23 AM
セルの内側にViewを入れる前提で作って、CellのViewプロパティがnilならViewを生成する、その時にViewに対してConstructorInjectionは出来ますね (edited)
Avatar
shtnkgm 19-Apr-18 01:41 AM
セルはコードベースで生成しているので、xibなどは利用してないです。 現在は以下のようにセッターインジェクションでDIしています。
let cell = collectionView.dequeueReusableCell(with: FilterCell.self, for: indexPath) cell.configure(image: image, name: name)
内包する案もよさそうですね、ありがとうございます
Avatar
shtnkgm 19-Apr-18 01:48 AM
Cellに直接コンストラクタDIする方法はないのだろうか🤔 (edited)
Avatar
tarunon 19-Apr-18 01:49 AM
そもそもcellはreuse前提のapiなので基本的には無いのが正しいと思います
😀 1
Avatar
shtnkgm 19-Apr-18 01:50 AM
確かに、初期化コストを抑える(初期化回数を減らす)ために再利用してますもんね
Avatar
shtnkgm 19-Apr-18 02:11 AM
registerでReuseIdentifierを設定していますが、dequeueを実行せずにカスタムイニシャライザを呼ぶと実行時クラッシュしてしまうようです
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the cell returned from -collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier - cells must be retrieved by calling -dequeueReusableCellWithReuseIdentifier:forIndexPath:'
Avatar
shtnkgm 19-Apr-18 02:18 AM
はい、同様のエラーでした
Avatar
Kishikawa Katsumi 19-Apr-18 02:20 AM
UICollectionViewは無理だと思います。
UITableViewはindexPath引数を取らないdequeue〜については自分で作って返すことができる(レガシー)けどUICollectionViewはその仕組みは無くなりました。
👍 2
Avatar
shtnkgm 19-Apr-18 02:31 AM
いえいえ、できないことも知れてよかったと思ってます!ありがとうございます
Avatar
norio_nomura 22-Apr-18 07:07 AM
なぜ message2でだけas [String : Any]が必要だと言われるのだろう? @swift-4.1.3
let content = "" let fields = [["name": "stdout.txt", "value": ""]] let message1 = fields.isEmpty ? ["content": content] : ["content": content, "embed": ["fields": fields]] let message2 = ["content": content, "embed": ["fields": fields]]
Avatar
swift41 BOT 22-Apr-18 07:07 AM
exit status: 1 with stderr:
main.swift:4:16: error: heterogeneous collection literal could only be inferred to '[String : Any]'; add explicit type annotation if this is intentional let message2 = ["content": content, "embed": ["fields": fields]] ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ as [String : Any]
Avatar
norio_nomura 22-Apr-18 07:08 AM
message1も同じ型になるのに。
Avatar
yokoya-s 22-Apr-18 02:43 PM
↑の方でお話があった「UITableViewCellやUICollectionViewCellでコンストラクタDI」の件、 コンストラクタDI とは異なりますが、 Token型を作って保証するという方法を以前 kuniwa/k 氏がお話していたので使えるかもしれません(要望と全然ずれていたらすみません) https://speakerdeck.com/orgachem/ios-detesutorong-yi-nashe-ji-wo-shi-xian-surutamefalsedezainpatan?slide=133
Avatar
norio_nomura 24-Apr-18 03:23 AM
dynamicMemberLookup 把握。subscript(dynamicMember:)の実装を必要とするアトリビュートなんだね。 @swift-4.2.4
@dynamicMemberLookup indirect enum UID: CustomStringConvertible { case root(String) case leaf(parent: UID, String) subscript(dynamicMember member: String) -> UID { return .leaf(parent: self, member) } var description: String { switch self { case .root(let string): return string case .leaf(let parant, let string): return "\(parant).\(string)" } } } let root = UID.root("root") print(root.a.b.c)
Avatar
swift42 BOT 24-Apr-18 03:23 AM
root.a.b.c
Avatar
taketo1024 24-Apr-18 03:27 AM
conditional conformance で Codable の auto-synthesize が効かないのはちと残念ですね…(いずれ対応されるのかしら)
extension Matrix: Codable where R: Codable { //Implementation of 'Decodable' cannot be automatically synthesized in an extension
Avatar
t.ae 24-Apr-18 03:28 AM
cond confというかextensionでauto-synthesizeされない〜ですね
Avatar
taketo1024 24-Apr-18 04:40 AM
あ、なるほど 🤥
Avatar
taketo1024 24-Apr-18 05:16 AM
Codable は touple とあんまり相性よくないんですね 🤥
Avatar
koher 24-Apr-18 05:22 AM
タプルは non-nominal なので、そうですね。タプルを Codable にしたいと思った場合は、大抵は struct を作れば解決する気がします。
😀 2
Avatar
taketo1024 24-Apr-18 06:50 AM
ふむふむ、なるほど。
しかし cond. conf. がなかったら上のようなケースで codable にしようとするのは絶望的なのでありがたいですね👍
generic な行列を json 化できました👍
Avatar
taketo1024 24-Apr-18 06:59 AM
JSONSerialization を使ってキャストまみれになる頃のことしか知らなかったので、テンション上がります 🙂
Avatar
koher 24-Apr-18 07:02 AM
Swift 4.1 で ArrayElementCodable なときだけ Codable になりました🙂
extension Array : Codable where Element : Codable { ... }
Avatar
taketo1024 24-Apr-18 07:04 AM
今ちょうどこれができるのを確認して 👍 ってなりました👍 (A, R: Codable で extend してる)
let elements = try container.decode([A : R].self, forKey: .elements)
(edited)
👍 1
Avatar
koher 24-Apr-18 08:33 AM
CGAffineTransform の逆行列は transform.inverted() なのに、 ARKit 等で使う simd の matrix_float4x4 の逆行列は matrix.inverse になってる・・・😂 (edited)
CGAffineTransform はかけ算も concatenating だし、基本的に行列として扱わないネーミングなのかな? (edited)
Avatar
koher 24-Apr-18 09:19 AM
1. Library A の中で Vector2Codable にして JSON に変換すると {"x":2,"y":3} のように出力させる実装をする 2. Library A の中で Vector2 を持つ struct Foo : Codable を作る 3. Library A を使う App B を作る 4. App B のあるファイルで Library A を import せずVector2Codable にして JSON に変換すると [2, 3] のように出力させる実装をする 5. App B の別のファイルで Library A を import して Vector2 を JSON に変換すると [2, 3]Foo を JSON に変換するとその中の Vector2{"x":2,"y":3} というのができた。 (edited)
つまり、 Vector2 に二通りの Codable の実装をして、それぞれ呼び分けることができた。なんとなくできない気がしてたけど、問題なかった。 (edited)
Avatar
tarunon 24-Apr-18 09:27 AM
スコープで参照するwitness table切り替えれるのすごいな
Avatar
koher 24-Apr-18 09:28 AM
衝突しそうと思ってました。
↑に限らず、 importCodable の実装を切り替えたりできそうですね。
Codable に限りませんが)
Avatar
tarunon 24-Apr-18 09:29 AM
protocol extensionがどのすこーぷにあるか、で、確かに優先順位が変動することがあったから
この動きは可能だし妥当に思えてきた
参照外のwitnesstableは見れてないなというのを思い出した
Avatar
omochimetaru 24-Apr-18 09:32 AM
LibraryAをimportしないでもVector2が使えるってことはVector2はまた別のパッケージに入っている?
Avatar
tarunon 24-Apr-18 09:34 AM
in LibA import LibX has Vector2 in AppB import LibX, LibA ということでは
Avatar
koher 24-Apr-18 09:35 AM
Vector2 は別パッケージです。
Avatar
omochimetaru 24-Apr-18 09:35 AM
なるほど。
Avatar
koher 24-Apr-18 09:36 AM
おや、さっきまで動いてたのに突然 redundant conformance だってエラーが出たぞ。あやしい・・・。
Avatar
omochimetaru 24-Apr-18 09:37 AM
AnyXxxのerasureを使えば
同じ型の値だが異なるwitness-tableを参照するオブジェクトを
まぜこぜにできるってことか。
AnyXxxに閉じ込めるときに解決されたconformanceが残る。
Avatar
koher 24-Apr-18 09:38 AM
ビルドできなくなった😂
えー、ビルドのゴミ(?)が残ってる状態でのみたまたまうまく動いたのかなぁ・・・。
また、今 iOS アプリで Carthage 経由でインストールしてるのもややこしい。 SwiftPM で試した方が良さそう。
Avatar
omochimetaru 24-Apr-18 09:42 AM
単一パッケージの中で fileprivate で conform して実験しようとしたけど protocol が internal だから internalでconformしなさいというエラーが出てしまった。 実験するにはマルチパッケージな構成にしないといけないけどめんどくさいのでやめた。
あ、SPMのソースディレクトリでターゲットをわければ簡単か?
Avatar
koher 24-Apr-18 09:44 AM
そう、それが面倒でこれまで検証してなかったけど、今たまたまそういう状況ができて、 import LibraryA をせずに Vector2 を持つ structCodable にしようとしたらエラーになったから、これはと思って試したんだけど
Avatar
tarunon 24-Apr-18 09:44 AM
今日だけで三回もカネパったし、結構いろいろありそうな気がしてる
Avatar
koher 24-Apr-18 09:45 AM
なぜか今は import LibraryA せずに Vector2 を持つ structCodable にできるようになってしまった。逆に Codable を付けようとすると redundant でエラーになる・・・。 (edited)
SPMのソースディレクトリでターゲットをわければ簡単か?
これと、別リポジトリになってるときに本当に同じなのかがイマイチ確信が持てないんだけど気にしなくていいのかな?
Avatar
omochimetaru 24-Apr-18 09:51 AM
できた
Avatar
omochimetaru 24-Apr-18 09:58 AM
[omochi@omochi-iMacPro k (master=)]$ cat Sources/App/main.swift import Nature import Japan import US var animals: [AnimalProtocol] = [] animals.append(createJapanCat()) animals.append(createUSCat()) animals.forEach { animal in print(animal.speak()) } [omochi@omochi-iMacPro k (master=)]$ swift run にゃあ meow
Contribute to swift-cross-module-conformance development by creating an account on GitHub.
これと、別リポジトリになってるときに本当に同じなのかがイマイチ確信が持てないんだけど気にしなくていいのかな?
import とか public とか internal とかの振る舞いを見てると同じように見えるから同じだと思ってます。
Avatar
rintaro 24-Apr-18 12:50 PM
なんとなく罠がありそうな気がするけど、まだ見つかっていない。
@koher さんの import せずに…ていうのが気になります。
Avatar
koher 24-Apr-18 01:03 PM
時間ができたらシンプルなプロジェクトで再現できるか試してみます。
🙏 1
Avatar
taketo1024 25-Apr-18 04:14 AM
TestTarget の build-config を Release にした場合、本体も Release build されるんでしょうか?それとも Test の部分のソースコードだけ? (edited)
Avatar
taketo1024 25-Apr-18 05:04 AM
全部 release になるっぽいですね
Avatar
taketo1024 25-Apr-18 10:00 AM
Int 演算の overflow を catch したい… 🤥
Avatar
omochimetaru 25-Apr-18 11:24 AM
‘&+’?
&+ ならオーバーフローしても落ちないです
I was writing a program in C++ to find all solutions of ab = c, where a, b and c together use all the digits 0-9 exactly once. The program looped over values of a and b, and ran a digit-counting ro...
例外投げる演算子は無いから、↑こういう感じでチェックしてはみ出すならthrowsする演算子を自分で定義するとか。
こんなのあった。
func addingReportingOverflow(_ other: Int) -> (partialValue: Int, overflow: Bool)
Avatar
taketo1024 25-Apr-18 11:32 AM
addWithOverflow の名前が変わったんですね 🙄
adding reporting って🐒
Avatar
omochimetaru 25-Apr-18 11:33 AM
まあこれも関数なので、これをラップして例外を投げる演算子にするのが良さそう
演算子って例外投げれるのか?
Avatar
taketo1024 25-Apr-18 11:33 AM
そうですねぇ 🙄
Avatar
omochimetaru 25-Apr-18 11:35 AM
@swiftbot
infix operator %+ struct E : Error {} func %+(a: UInt32, b: UInt32) throws -> UInt32 { let c = a.addingReportingOverflow(b) if c.overflow { throw E() } return c.partialValue } try UInt32(0x80_00_00_00) %+ UInt32(0x80_00_00_00)
🛠 1
Avatar
swiftbot BOT 25-Apr-18 11:35 AM
Swift version 4.1 (swift-4.1-RELEASE)
/usercode/main.swift:11:27: warning: result of operator '%+' is unused try UInt32(0x80_00_00_00) %+ UInt32(0x80_00_00_00) ~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~ Fatal error: Error raised at top level: main.E(): file /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/stdlib/public/core/ErrorType.swift, line 191 Current stack trace: 0 libswiftCore.so 0x00007f8e1fc285c0 _swift_stdlib_reportFatalErrorInFile + 221 1 libswiftCore.so 0x00007f8e1f9973dc <unavailable> + 1369052 2 libswiftCore.so 0x00007f8e1fbd1222 <unavailable> + 3703330 3 libswiftCore.so 0x00007f8e1fbd2689 <unavailable> + 3708553 4 libswiftCore.so 0x00007f8e1f996ad6 <unavailable> + 1366742 5 libswiftCore.so 0x00007f8e1fbd0feb <unavailable> + 3702763 6 libswiftCore.so 0x00007f8e1f996ad6 <unavailable> + 1366742 7 libswiftCore.so 0x00007f8e1fb03f79 <unavailable> + 2862969 8 libswiftCore.so 0x00007f8e1f9d4960 swift_errorInMain + 318 10 swift 0x0000000000fed1ce <unavailable> + 12505550 11 swift 0x0000000000ff1692 <unavailable> + 12523154 12 swift 0x00000000004d9076 <unavailable> + 888950 13 swift 0x00000000004c35d3 <unavailable> + 800211 14 swift 0x00000000004beecc <unavailable> + 782028 15 swift 0x00000000004778c4 <unavailable> + 489668 16 libc.so.6 0x00007f8e22141740 __libc_start_main + 240 17 swift 0x0000000000475179 <unavailable> + 479609 /usr/bin/swift[0x3f24d54] /usr/bin/swift[0x3f25096] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f8e23a17390] ...
2.55 KB
Avatar
omochimetaru 25-Apr-18 11:36 AM
できた。
Avatar
taketo1024 25-Apr-18 11:36 AM
おぉw
Avatar
omochimetaru 25-Apr-18 11:36 AM
でも計算性能がだいぶ落ちそうだなぁ・・・
Avatar
taketo1024 25-Apr-18 11:37 AM
ですねぇ…w
元々そのために入れてないっぽいですしね。
Avatar
koher 26-Apr-18 02:09 AM
@taketo1024
Int 演算の overflow を catch したい…
やりたいことにもよりますが、一般的には演算の overflow は Logic failure なので catch すべきでないと思います。
Avatar
omochimetaru 26-Apr-18 02:11 AM
実際にものすごい数が出て来る計算をさせてるんかなと思ってそこはスルーしてた
Avatar
koher 26-Apr-18 02:11 AM
Swift において overflow が Logic failure なのは、パフォーマンス上のメリットもありますが、 array[i] などと同じく API 設計上の意図的なものだと思うので。 (edited)
Avatar
taketo1024 26-Apr-18 05:56 AM
はい、大量の計算を高速にやる中で、全部に範囲チェックを入れるのはパフォーマンスに支障がありそうなので避けたい、というケースでした。
Avatar
taketo1024 26-Apr-18 10:56 AM
https://stackoverflow.com/questions/39815054/how-to-include-assets-resources-in-a-swift-package-manager-library/39878338 Swift PM はまだライブラリにリソースを一緒に入れるのには対応してないんですかね。 (edited)
I would to ship my library usign Apple's Swift Package Manager. However my lib includes a .bundle file with seveal strings translated in different languages. Using cocoapods I can include it using ...
実行時に json を読み込む、というようなことがしたいのですが 🙄
Avatar
omochimetaru 26-Apr-18 11:06 AM
対応してないですね
jsonなら文字列として入れる手もあります。トリプルダブルクォートで。
Avatar
taketo1024 26-Apr-18 11:32 AM
ちなみに今はこんな感じにやってますw
10_129 まである 😵
Avatar
omochimetaru 26-Apr-18 11:33 AM
そこまでリテラルでかいとコンパイル遅くなりませんか?
Avatar
taketo1024 26-Apr-18 11:33 AM
そうなんですよw
Avatar
omochimetaru 26-Apr-18 11:33 AM
ww
Avatar
taketo1024 26-Apr-18 11:33 AM
なのでテキストデータとしておいておきたいなぁと 🤥
Avatar
omochimetaru 26-Apr-18 11:34 AM
文字列リテラルでjson持ちましょう
Avatar
taketo1024 26-Apr-18 11:34 AM
それがよさそうですね、ありがとうございます。
Avatar
norio_nomura 26-Apr-18 10:17 PM
swift - Swift for TensorFlow documentation repository.
Avatar
kenmaz 26-Apr-18 10:20 PM
let o1 = tanh(x ⊗ w1 + b1)
内積演算子(テンソル積演算子?)、どうやって入力するんだろう..
(edited)
Avatar
kenmaz 26-Apr-18 11:07 PM
import TensorFlow let x = Tensor<Float>(shape: [1, 2], repeating: 0.1) let y = Tensor<Float>(shape: [3, 4], repeating: 0.1) let matmul = x ⊗ y print(matmul)
test.swift:5:16: error: internal error generating TensorFlow graph: Dimensions must be equal, but are 2 and 3 for 'op.test.swift.5.16' (op: 'MatMul') with input shapes: [1,2], [3,4]. let matmul = x ⊗ y
(edited)
これがちゃんとコンパイルエラーになってくれる
👀 1
Avatar
omochimetaru 27-Apr-18 12:59 AM
良いですねえ
Avatar
norio_nomura 27-Apr-18 01:05 AM
@swift-tensorflow
import TensorFlow let x = Tensor<Float>(shape: [1, 2], repeating: 0.1) let y = Tensor<Float>(shape: [3, 4], repeating: 0.1) let matmul = x ⊗ y print(matmul)
Avatar
swiftTensorflow BOT 27-Apr-18 01:05 AM
exit status: 1 with stderr:
main.swift:4:21: error: internal error generating TensorFlow graph: GraphGen cannot lower a 'receive' from the host yet let y = Tensor<Float>(shape: [3, 4], repeating: 0.1) ^
😀 1
Avatar
omochimetaru 27-Apr-18 01:06 AM
もうボットになったの
Avatar
Kishikawa Katsumi 27-Apr-18 01:06 AM
Tensorflowボットできとる
わしもimport
できるようにしよう。
Avatar
omochimetaru 27-Apr-18 01:06 AM
たしかにバージョンの1つなのかw
Avatar
norio_nomura 27-Apr-18 01:07 AM
Avatar
koher 27-Apr-18 01:36 AM
@taketo1024 巨大な array literal や dictionary literal は重いですが、 JSON にしなくてもリテラルを分割すればビルドは軽くなるんじゃないかと思います。
Avatar
koher 27-Apr-18 02:56 AM
Swift for Tensorflow の macOS 用ビルドって裏で Metal 使って GPU 使ってくれたりしないのかな? CPU のみ?
swift-tensorflow チャネルが必要な気がしてきた。
Avatar
omochimetaru 27-Apr-18 03:00 AM
#swift-tensorflow 作りました
👍 5
Avatar
taketo1024 27-Apr-18 07:46 AM
弊ライブラリでも ⊗ 使ってて、入力を楽にするために CodeSnippet を作りました👍 (edited)
😀 1
https://github.com/taketo1024/SwiftyMath/blob/master/CodeSnippets/885A162B-C94C-4085-A858-99634B46259C.codesnippet @kenmaz 👆これを ~/Library/Developer/Xcode/UserData/ に入れればすぐ出ます。 (edited)
SwiftyMath - Pure Math in Pure Swift.
😀 1
もっといい方法があったら教えてください 🙏
Avatar
tarunon 27-Apr-18 08:06 AM
⌥も⌥⇧にも入ってないのか
の方がまだ入力しやすい
Avatar
t.ae 27-Apr-18 08:07 AM
で自分で再定義すればいいのでは
Avatar
Kishikawa Katsumi 27-Apr-18 08:13 AM
⌘+⌃+Space、「Circled times」で検索、、、かな。
まあコードスニペットの方が楽そう。
Avatar
tarunon 27-Apr-18 08:38 AM
function  (lhs ... ) { ... }
Avatar
norio_nomura 03-May-18 10:59 PM
Keyに略語などで全部大文字な単語とかが含まれると、JSONEncoder.KeyEncodingStrategy.convertToSnakeCaseJSONDecoder.KeyDecodingStrategy.convertFromSnakeCaseが非対称となる問題のスレッドがSwift Forumではじまりました。 https://forums.swift.org/t/handling-edge-cases-in-jsonencoder-jsondecoder-key-conversion-strategies-sr-6629/12384
import Foundation struct S: Codable { var myURLProperty: String } let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase let data = try encoder.encode(S(myURLProperty: "property")) let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase let decoded = try decoder.decode(S.self, from: data) // "No value associated with key CodingKeys(stringValue: \"myURLProperty\", intValue: nil) (\"myURLProperty\"), converted to my_url_property."
上記コードはLinuxでは動きません。
(edited)
@hartbit recently revived some discussion about this topic in a PR by @norio_nomura, and I figured that instead of restricting the discussion to the PR, this would be a perfect opportunity to solicit some community feedback. As such: Hi all, I...
👀 4
Avatar
hiragram 09-May-18 01:36 AM
danger-swift使ってる人いますか?brew経由で入れようとすると依存解決に失敗してインストールできないんですけど僕の環境が悪いんだろうか
Failing to resolve dependencies. What can I do? Is this due to my local environment? $ brew install danger/tap/danger-swift ==> Installing danger-swift from danger/tap ==> Downloading https:/...
Avatar
norio_nomura 10-May-18 12:13 PM
swiftの標準入力へソースコードを渡して実行させる時、-以降をCommandLine.argumentsとして取り出せるのね。
$ echo 'dump(CommandLine.arguments)' | swift -Onone - -verbose ▿ 2 elements - "-" - "-verbose"
Avatar
omochimetaru 10-May-18 12:15 PM
便利そう
Avatar
Kishikawa Katsumi 10-May-18 01:28 PM
@swiftbot $ echo 'dump(CommandLine.arguments)' | swift -Onone - -verbose
Avatar
swiftbot BOT 10-May-18 01:28 PM
▿ 2 elements - "-" - "-verbose"
Avatar
Kishikawa Katsumi 10-May-18 01:28 PM
なるほど。
Avatar
norio_nomura 10-May-18 02:42 PM
LinuxでのUserDefaults.argumentDomainサポートは4.2から。 @swift-4.1.3 @swift-4.2.4 - -param1 yes
import Foundation print(CommandLine.arguments) print("param1: \(UserDefaults.standard.bool(forKey: "param1"))")
Avatar
swift42 BOT 10-May-18 02:42 PM
["-", "-param1", "yes"] param1: true
Avatar
swift41 BOT 10-May-18 02:42 PM
["-", "-param1", "yes"] param1: false
Avatar
Kishikawa Katsumi 10-May-18 02:43 PM
LinuxのUserDefaultsってどこに保存されるんですかね。
Avatar
norio_nomura 10-May-18 02:54 PM
どこだろう?
Avatar
Kishikawa Katsumi 10-May-18 02:57 PM
デフォルトはplistなんですかね。BSDじゃないシステムにplutilとか入ってるのかな。
Avatar
rintaro 16-May-18 02:35 AM
Google が swift フォーマッタ開発していることが暗に公開されている。
Alex is the tech lead of Google’s Swift Language Support team, the primary maintainer of google/swift, and responsible for various open-sourced and to-be-open-sourced Swift tools such as swift-format
http://swiftfest.io/schedule/#session-030
The most community driven Swift conference!
👀 1
Avatar
Avatar
rintaro 16-May-18 03:00 AM
おー、もうフォーク上で開発進めてるのですね。
https://google.github.io/swift/ これも初めて知りました。
Google's Swift style guide.
Avatar
koher 16-May-18 03:06 AM
それ(スタイルガイド)今見てました。 GitHub のやつとかは昔話題になりましたけど、それは知りませんでした。
Avatar
kenmaz 16-May-18 03:07 AM
すごいしっかりしたドキュメント、、
Avatar
taketo1024 30-May-18 02:32 PM
@swiftbot
protocol A{} struct S<X> {} extension S: A where X == Int {} extension S: A where X == String {}
🛠 1
Avatar
swiftbot BOT 30-May-18 02:32 PM
Author icon taketo1024
protocol A{} struct S<X> {} extension S: A where X == Int {} extension S: A where X == String {}
Version:
swift-4.1.1-RELEASE
Output:
Error:
/usercode/main.swift:4:14: error: redundant conformance of 'S<X>' to protocol 'A' extension S: A where X == Int {} ^ /usercode/main.swift:5:1: note: 'S<X>' declares conformance to protocol 'A' here extension S: A where X == String {} ^
Avatar
taketo1024 30-May-18 02:33 PM
異なる条件で同一の protocol を confirm させるのってできないんですね…😟
Avatar
tarunon 30-May-18 02:33 PM
あ、それできないんですよ
Avatar
taketo1024 30-May-18 02:33 PM
実務でもこれやりたいケース多そうな🙄
Avatar
tarunon 30-May-18 02:33 PM
なので、IntとStringをそれぞれ共通のprotocolに対応させて、共通protocolでエイヤとやります
まさに、Addableみたいなのを作って適合して、Addableでcondconfする、みたいな感じになります
Avatar
omochimetaru 30-May-18 02:37 PM
protocol IntOrString {} extension Int : IntOrString {} extension String : IntOrString {} extension S: A where X: IntOrString {}
Avatar
tarunon 30-May-18 02:38 PM
condconfのために、勝手に適合できないprotocolを作りたい、みたいな要求はありそう
Avatar
omochimetaru 30-May-18 02:38 PM
↑べた書きすればこういう感じです。実際にはIntOrStringではなくこのIntとStringが満たしたい共通の性質を表したもっとよい名前のほうがいいですね。
Avatar
taketo1024 30-May-18 02:38 PM
なるほど…😕ちと自分のケースだと難しそうです…😓
Avatar
tarunon 30-May-18 02:39 PM
いやなんとかなるはず
Avatar
taketo1024 30-May-18 02:40 PM
多分厳しいですw
Avatar
tarunon 30-May-18 02:42 PM
enum AorB { case a(A) case b(B) } protocol AorBProtocol { var _value: AorB { get } } extension A: AorBProtocol { var _value: AorB { return .a(self) } extension B: AorBProtocol { var _value: AorB { return .b(self) } extension Array: Foo where Element: AorBProtocol { func fooFunc() { forEach { switch $0._value { case .a(let a): // write a case here case .b(let b): // write b case here } } } }
(edited)
一般化
これをNに拡張すればOK
Avatar
taketo1024 30-May-18 02:42 PM
それはわかるんですが、
Avatar
tarunon 30-May-18 02:43 PM
Generics持ちかな
Avatar
taketo1024 30-May-18 02:43 PM
継承関係が複雑で無理っぽいです
Avatar
tarunon 30-May-18 02:43 PM
フーム
基本的に否定以外の条件付けは全部なんとかなる認識なんですが、否定が入ってるのかな
Avatar
taketo1024 30-May-18 02:45 PM
protocol A1 {} protocol A2: A1 {} protocol A3: A2 {} struct C<R>: A1 extension C: A2, A3 where R == X extension C: A2 where R == Y
(edited)
複素数体を generic な Complex<R> にして、複素数体 C = Complex<Real> と ガウス整数環 Complex<Int> を共通化しようとしまして、 (edited)
Avatar
tarunon 30-May-18 02:47 PM
@swiftbot
protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 {} protocol A2: A1 {} protocol A3: A2 {} struct C<R>: A1 { } extension C: A2 where R: XorY { } extension C: A3 where R == Y { }
🛠 1
Avatar
swiftbot BOT 30-May-18 02:47 PM
Author icon tarunon
protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 {} protocol A2: A1 {} protocol A3: A2 {} struct C<R>: A1 { } extension C: A2 where R: XorY { } extension C: A3 where R == Y { }
Version:
swift-4.1.1-RELEASE
Output:
Error:
Avatar
taketo1024 30-May-18 02:48 PM
うーん、まぁ、ちょっと厳しそうですw
Avatar
tarunon 30-May-18 02:50 PM
@swiftbot
protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 { func a1() -> String } protocol A2: A1 { func a2() -> String } protocol A3: A2 { func a3() -> String } struct C<R>: A1 { func a1() -> String { return "a1\(R.self)" } } extension C: A2 where R: XorY { func a2() -> String { return "a2\(R.self)" } } extension C: A3 where R == Y { func a3() -> String { return "a3\(R.self)" } } print(C<X>().a1()) print(C<X>().a2()) // print(C<X>().a3()) // compile error print(C<Y>().a1()) print(C<Y>().a2()) print(C<Y>().a3())
シンプルな例ならイケそうな雰囲気はありますが…もしかしたら別のところでダメなのかも
(edited)
🛠 1
Avatar
swiftbot BOT 30-May-18 02:50 PM
(edited)
Author icon tarunon
protocol XorY {} struct X: XorY {} struct Y: XorY {} protocol A1 { func a1() -> String } protocol A2: A1 { func a2() -> String } protocol A3: A2 { func a3() -> String } struct C<R>: A1 { func a1() -> String { return "a1\(R.self)" } } extension C: A2 where R: XorY { func a2() -> String { return "a2\(R.self)" } } extension C: A3 where R == Y { func a3() -> String { return "a3\(R.self)" } } print(C<X>().a1()) print(C<X>().a2()) // print(C<X>().a3()) // compile error print(C<Y>().a1()) print(C<Y>().a2()) print(C<Y>().a3())
Version:
swift-4.1.1-RELEASE
Output:
a1X a2X a1Y a2Y a3Y
Error:
Avatar
tarunon 30-May-18 02:54 PM
やりたいの事がダメだとわかった状態のコミットってありますか? @taketo1024
Avatar
Avatar
tarunon 30-May-18 02:58 PM
オッシャ
Avatar
taketo1024 30-May-18 02:58 PM
EuclideanRing というのはあまりつきの割り算ができる環で、
Ring > EuclideanRing > Field と継承されるのですが、
Field というのは 0 でない数は逆数を持つ体で、余は常に 0 になるような特別な EuclideanRing となってます。
複素数 ComplexNumber は Field で、ガウス整数は EuclideanRing なのですが、
余りつき割り算のやり方が全然違うので共通化できなそう(できても可読性が著しく下がりそう)という感じでした…🙄
複素数の実部と虚部を整数に制限したのがガウス整数です。
複素数平面上の格子点。 (edited)
Avatar
omochimetaru 30-May-18 03:03 PM
なるほど
実装は共通化しなくてよくて、さっきのIntOrString等から、もともとのIntやStringをenum経由で取り出すメソッドをもたせちゃえばいいので
Avatar
taketo1024 30-May-18 03:07 PM
なるほど…
Avatar
tarunon 30-May-18 03:07 PM
本質的に
Complex: EuclideanRing, Field, NormedSpace であるためのRの条件ってなんですかね
R: EuclideanRing, Field, NormedSpace ?
Avatar
taketo1024 30-May-18 03:08 PM
R == 𝐑 です
ちと記号がややこしいですがw、太字 𝐑 が実数で、 R は一般のジェネリック型です。
Avatar
omochimetaru 30-May-18 03:09 PM
public typealias 𝐑 = RealNumber
太字のRは Real.swift にあった。
Avatar
tarunon 30-May-18 03:10 PM
日本語が悪かった。具体型としてRealNumberではなく、なんの性質があればそれぞれどれが成り立ちますか?
Avatar
taketo1024 30-May-18 03:10 PM
それは難しい問題ですね…🙄
Avatar
tarunon 30-May-18 03:10 PM
Complex: EuclidenRingはR: EuclidenRingであればなりたつ?
Avatar
taketo1024 30-May-18 03:10 PM
一般論はちょっと分からないです
Avatar
tarunon 30-May-18 03:10 PM
なるほど。。。
Avatar
taketo1024 30-May-18 03:11 PM
というのも GaussInt が EuclideanRing であるのも、R == Int であることをかなり強く使うので…
もしかしたら統一的な一般論があるのかもしれませんが、僕は知らないです😣
Avatar
omochimetaru 30-May-18 03:11 PM
突き詰めると Int の満たす性質みたいになっちゃって、数学的な議論が一段抽象化しちゃうことになりそう。
Avatar
tarunon 30-May-18 03:12 PM
統一的な一般論があれば、Intをその統一した型に適合して完了だと思ったのです
Avatar
taketo1024 30-May-18 03:12 PM
例えば体上の一変数多項式環は EuclideanRing なのですが、これに i をつけたものが EuclideanRing になるかは分からないです🙄
Avatar
omochimetaru 30-May-18 03:12 PM
git cloneが全然落ちてこない・・・
Avatar
taketo1024 30-May-18 03:12 PM
はい、それで難しそうかなと思いました。
enum AorB { case a(A) case b(B) } protocol AorBProtocol { var _value: AorB { get } }
すいません、こちらはちょっと理解が不十分でした、
Avatar
tarunon 30-May-18 03:13 PM
結構大きいですよね、そしてコンパイルも時間かかるw
Avatar
taketo1024 30-May-18 03:13 PM
enum も protocol も新たに作るってことだったんですね。
Avatar
omochimetaru 30-May-18 03:13 PM
ですね、そのconformanceを無理やりやるためにadhocに記述するという感じです
Avatar
tarunon 30-May-18 03:13 PM
とりあえず一般論は無理ということで、RealNumberとIntだけでも満たしてみますか
Avatar
taketo1024 30-May-18 03:13 PM
あぁ、最近実験用データを 1GB 近く別ブランチに入れたのでそのせいかもです。
Avatar
tarunon 30-May-18 03:13 PM
1GBw
Avatar
omochimetaru 30-May-18 03:14 PM
githubって1リポジトリ1Gまでじゃなかったっけ。。
Avatar
taketo1024 30-May-18 03:14 PM
We recommend repositories be kept under 1GB each. This limit is easy to stay within if large files are kept out of the repository. If your repository exceeds 1GB, you might receive a polite email from GitHub Support requesting that you reduce the size of the repository to bring it back down.
まずいっすねw
Avatar
omochimetaru 30-May-18 03:15 PM
ww
Avatar
tarunon 30-May-18 03:18 PM
ああ、大丈夫か
いやこれむずいすねw
Avatar
taketo1024 30-May-18 03:20 PM
共通化するなら ComplexType みたいな protocol を作って、struct は別々に定義するのがいいんですかね。
Avatar
tarunon 30-May-18 03:24 PM
もうちょいでいけそう
Avatar
omochimetaru 30-May-18 03:24 PM
こちらclone 14%
Avatar
tarunon 30-May-18 03:25 PM
うち1GBPS回線になったから割とぱっと落ちてきた
Avatar
omochimetaru 30-May-18 03:26 PM
あくまでComplex<R>がEuclidenRingになるRってことだから
protocol MakeComplexEuclideanRingHack (edited)
とかやっとくと余計なこと考えなくて良いかも・・・
Avatar
tarunon 30-May-18 03:28 PM
いやー
それがFieldとかと循環してる構造になってるのが難しい
Avatar
omochimetaru 30-May-18 03:28 PM
ほう
Avatar
tarunon 30-May-18 03:28 PM
FieldならEuclidenRingの実装が自明になる
Avatar
omochimetaru 30-May-18 03:32 PM
あーそゆこと
R == RealNumber のときには
Complex : Field のconformanceから
Complex : EuclideanRingのconformanceは自動実装されるから
EuclideanRingのconformanceをadhocに作っちゃうと
Fieldからの経路が潰れるのか。
Avatar
taketo1024 30-May-18 03:33 PM
そうなんです
Avatar
tarunon 30-May-18 03:35 PM
なんか気がついたんですが
これDiagnos出てくるとRとZが崩壊しますね
Avatar
taketo1024 30-May-18 03:35 PM
あぁ、そうなんですよねw
謎の三角みたいなのが出てくるw
Avatar
omochimetaru 30-May-18 03:35 PM
Avatar
taketo1024 30-May-18 03:35 PM
とりあえず素朴に
public protocol ComplexType: Ring { associatedtype Base: Ring init(_ x: Base) init(_ x: Base, _ y: Base) static var imaginaryUnit: Self { get } var realPart: Base { get } var imaginaryPart: Base { get } var inverse: Self? { get } var conjugate: Self { get } }
ってして、 protocol extension つける方向で行こうかと思います😅
Avatar
omochimetaru 30-May-18 03:37 PM
Complexをジェネリクスにするのを諦めて ComplexRealNumber : ComplexTypeとGaussInt : ComplexType にするってことですか?
Avatar
taketo1024 30-May-18 03:37 PM
はい。
Avatar
omochimetaru 30-May-18 03:37 PM
なるほど・・・素朴にはそれで逃げれますね
Avatar
taketo1024 30-May-18 03:38 PM
さっきの enum もクールではありますが、そこまでトリッキーなことやるほどこういうケースがわんさか出てくる訳でもないので(勉強にはなりました、ありがとうございます 🙇
Avatar
tarunon 30-May-18 03:38 PM
あとちょっとなんじゃが
Avatar
taketo1024 30-May-18 03:38 PM
どうすればできるのかは見て見たいですw
Avatar
tarunon 30-May-18 03:38 PM
これ実際に動いてるかチェックする簡単な式はありますか?
Avatar
taketo1024 30-May-18 03:38 PM
おぉ
ComplexNumber 用のテストはあります。
Avatar
tarunon 30-May-18 03:44 PM
めっちゃ苦しい上にForceCastもFatalErrorも出てきて敗北って感じがするw
しんどすぎ、2項演算のせいでenumのcaseがはみ出すわ、返り値がSelfなので型として復元不能になるわでめちゃくちゃです
Avatar
omochimetaru 30-May-18 03:52 PM
where付きextensionの中にenum定義できるんだw
Avatar
tarunon 30-May-18 03:52 PM
あとなんか、FieldなのにFieldに定義されたdefault implが参照されなくって結果全部分解した割り算を平たく各羽目に
typeはprotocol内以外はどこでもかける
Avatar
omochimetaru 30-May-18 03:53 PM
急にclone終わったから俺もやってみよ
Avatar
tarunon 30-May-18 03:55 PM
この間shield classをswiftでやるみたいなのやってたよね
あれ応用したら少しはましになるかもしらん
Avatar
omochimetaru 30-May-18 03:55 PM
shieldじゃなくてsealedね
それもカッコいいけど
==同士が衝突するのは定義の優先度が等しいからなのかな
Avatar
tarunon 30-May-18 03:59 PM
==どこや
Avatar
omochimetaru 30-May-18 03:59 PM
whereの R==RealNumberと R==Zが
ぶつかるそもそもの話
Avatar
tarunon 30-May-18 03:59 PM
condconfがなぜできないか、か
Avatar
omochimetaru 30-May-18 04:00 PM
うん
複数のがあっても、 == と : だったら
衝突しないで強い方で解決するよね
Avatar
tarunon 30-May-18 04:00 PM
そうだっけか
@swiftbot
extension Array: Equatable where Element==Int {}
(edited)
🛠 1
Avatar
swiftbot BOT 30-May-18 04:01 PM
(edited)
Author icon tarunon
extension Array: Equatable where Element==Int {}
Version:
swift-4.1.1-RELEASE
Output:
Error:
/usercode/main.swift:1:18: warning: conformance of 'Array<Element>' to protocol 'Equatable' was already stated in the type's module 'Swift' extension Array: Equatable where Element==Int {} ^ Swift.Array<Element>:1:11: note: 'Array<Element>' declares conformance to protocol 'Equatable' here extension Array : Equatable where Element : Equatable { ^
Avatar
tarunon 30-May-18 04:02 PM
だめじゃないすかねこれ
あたいぽ
Avatar
omochimetaru 30-May-18 04:02 PM
wheseになってるよ
Avatar
tarunon 30-May-18 04:03 PM
ダメみたいだ
えっとあとは
@swiftbot
extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } }
(edited)
あっ、リプじゃないと編集は反応しないか
@swiftbot
extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } }
🛠 1
Avatar
swiftbot BOT 30-May-18 04:05 PM
Author icon tarunon
extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } }
Version:
swift-4.1.1-RELEASE
Output:
Error:
/usercode/main.swift:1:18: warning: conformance of 'Array<Element>' to protocol 'Equatable' was already stated in the type's module 'Swift' extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } } ^ /usercode/main.swift:1:63: note: operator function '==' will not be used to satisfy the conformance to 'Equatable' extension Array: Equatable where Element==Never { static func == (lhs: Array, rhs: Array) -> Bool { return true } } ^ Swift.Array<Element>:1:11: note: 'Array<Element>' declares conformance to protocol 'Equatable' here extension Array : Equatable where Element : Equatable { ^
Avatar
tarunon 30-May-18 04:05 PM
だめじゃないすかねこれ
Avatar
taketo1024 30-May-18 04:36 PM
色々ありがとうございます!
ひとまず寝ます 😴
Avatar
omochimetaru 30-May-18 05:39 PM
本質的にたるのんと同じ状態
CondConfの現実装の限界がわかってきた
あれ、勘違いしてた、 Complex<GaussInt> じゃないわ
Avatar
tarunon 30-May-18 11:46 PM
これ割り算無限ループしなかった?
Avatar
omochimetaru 31-May-18 12:40 AM
実行してない
Avatar
norio_nomura 06-Jun-18 02:34 AM
@swift-4.2.4 -swift-version 4
#if swift(>=4.2) print("swift-4.2") #elseif swift(>=4.1.50) print("swift-4.1.50") #elseif swift(>=4.1.2) print("swift-4.1.2") #endif
Avatar
swift42 BOT 06-Jun-18 02:34 AM
swift-4.1.50
Avatar
omochimetaru 06-Jun-18 02:36 AM
あれ?
@swift-4.2.4 --version (edited)
Avatar
swift42 BOT 06-Jun-18 02:36 AM
Swift version 4.2-dev (LLVM a38ff55b31, Clang 5272858825, Swift defc3e9073) Target: x86_64-unknown-linux-gnu
(edited)
Avatar
norio_nomura 06-Jun-18 02:38 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 06-Jun-18 02:39 AM
introducing a new compiler directive that is syntactically equivalent to the swift directive but checks against the version of the compiler,
難しいですね
Avatar
Kishikawa Katsumi 06-Jun-18 09:58 AM
自分の中で2周くらい回って @lovee さんのNotAutoLayoutはだいぶセンスがあるなという気になってきました。 これがAutoLayoutが出る前に作られていたら世界を席巻したんじゃないかなあ。
持って回った言い方をしてるけど皮肉でもなんでもなくて、よく考えて作ってあるなあという気持ちです。
Avatar
omochimetaru 06-Jun-18 10:03 AM
ほほ〜
Avatar
lovee 06-Jun-18 01:12 PM
@Kishikawa Katsumi ありがとうございます 🙇 ここまでくるとなんか逆に名前がふざけてるようにしか見えなくて改名すべきか悩むんですよね 🤔
Avatar
Kishikawa Katsumi 06-Jun-18 01:13 PM
まあそうですねえ。こういう分かりやすさは当然反発も生むので。
一般論として。
Avatar
lovee 06-Jun-18 01:14 PM
ちなみに次の予定は @omochimetaru さんの gysb でテンプレでコード生成したい気分です
😃 1
Avatar
Kishikawa Katsumi 06-Jun-18 01:14 PM
あとまあどうしてもキワモノっぽく見えるというのはありますね。
Avatar
lovee 06-Jun-18 01:14 PM
いちいち全部直でレイアウトプロパティー作ると大変だしバグりやすいし
ですね
正直当時なんも考えてなかったからな 😇 最初は「ManualLayout」にしたかったけどGitHubで検索してみたら既に同じ名前のがあったので考えるのだるかったからNotAutoにした訳でそろそろ4.0の時に名前考え直さないと…
Avatar
Kishikawa Katsumi 06-Jun-18 01:16 PM
NotAutoLayoutはある程度の違反はコンパイルエラーになるというのが良いです。 (edited)
Avatar
lovee 06-Jun-18 01:18 PM
やっぱり静的型付けは間違ったらコンパイルエラーが出るのがとても助かると思いますので
石川先生の言葉ですね、「いい設計とは、間違った用法をコンパイルエラーにする」
Avatar
Kishikawa Katsumi 06-Jun-18 01:19 PM
読む負荷はあまり変わらないかな?個人的には。 どっちも大変。
Avatar
lovee 06-Jun-18 01:19 PM
コンパイルエラーにできるものはその分テスト書かなくて済むというメリットもあるかと()
Avatar
Kishikawa Katsumi 06-Jun-18 01:23 PM
どうかなあ。ビューのOutputは失敗ケースの範囲がさまざまだし、Inputも安定しないから、コンパイルエラーになるケースを弾いても
。。。
それほど安心できない。
Avatar
lovee 06-Jun-18 01:25 PM
ああ、今のは単純に一般論的な話で、例えばSwiftだとOptionalの仕組みがあるのでObj-Cの時みたいに至る所で nil パターンのテスト書かなくて済むメリットがあるのかなという意味です
Avatar
Kishikawa Katsumi 06-Jun-18 01:26 PM
ああ、それはその通りですね。
Avatar
koher 07-Jun-18 01:22 AM
NotAutoLayout 、名前がわかりやすくていいと思いますけどね〜 (edited)
結構浸透してるのでリネームはもったいないかも?
Avatar
lovee 07-Jun-18 03:42 AM
ふざけてるように見えるのが難点ですよね、あと英語的に「Why Not Auto Layout」と「Why NotAutoLayout」が真逆の意味なのに全く同じに聞こえるのも地味に痛い気が
Avatar
koher 07-Jun-18 04:24 AM
w > 「Why Not Auto Layout」と「Why NotAutoLayout」
Avatar
Kishikawa Katsumi 07-Jun-18 04:44 AM
仕組みは利用者にとっては重要じゃないので、その観点でいうともっと良い名前はあると思いますね。
Avatar
Biacco42 07-Jun-18 05:29 AM
Why Not Auto Layout? で、「そうなんだけど Auto Layout こういうのクソじゃん〜」からの Why NotAutoLayout で NotAutoLayout の良さを説明する、的な
Avatar
lovee 07-Jun-18 06:47 AM
DirectLayoutとかどうでしょう 🤔
Avatar
koher 07-Jun-18 06:48 AM
NonAutoLayout とか?
Avatar
lovee 07-Jun-18 06:50 AM
NonもNotもイメージ的にあんまり変わらないですね 😇
Avatar
t.ae 07-Jun-18 06:50 AM
¬AutoLayout
👍 1
Avatar
koher 07-Jun-18 06:52 AM
『「Why Not Auto Layout」と「Why NotAutoLayout」』問題は解決できるかと🙃 < NonAutoLayout
AntiAutoLayout とかw
Avatar
omochimetaru 07-Jun-18 06:53 AM
AbsoluteKiller
Avatar
lovee 07-Jun-18 10:18 AM
物騒なライブラリーだなw > AbsoluteKiller
Avatar
omochimetaru 07-Jun-18 10:18 AM
絶対殺すマンで定着しているので・・・
🍀 2
Avatar
lovee 07-Jun-18 10:20 AM
¬AutoLayout は多分そもそもGitHubでリポジトリ作れないしCartfileとかで指定できなさそうな気が 🤔
Avatar
hironytic 07-Jun-18 10:39 AM
別にAuto Layoutの逆になってるわけでもなくて、実は素直なレイアウトエンジンなんですよねー。
Avatar
noppe 07-Jun-18 10:41 AM
Pureとか思いついたけどもうあったマン
Avatar
Kishikawa Katsumi 07-Jun-18 10:45 AM
そう、動機はそうかもしれないけど、それはもはや関係ないし、利用者にとってはもっと関係ない、と思います。
Avatar
hironytic 07-Jun-18 10:50 AM
DescribableLayout
DeclarativeLayoutとかSwiftyLayoutとかは当たり前のごとくすでにある・・・
Avatar
335g 07-Jun-18 12:12 PM
単純にLayoutっていう名前では🤔
Avatar
lovee 07-Jun-18 02:06 PM
Layout って名前 つよい
Avatar
t.ae 12-Jun-18 07:32 AM
@swiftbot
let f = Float.nan let a = [f] let b = [f] print(f == f) // false print(a == a) // true print(a == b) // false
🛠 1
Avatar
swiftbot BOT 12-Jun-18 07:32 AM
Author icon t.ae
let f = Float.nan let a = [f] let b = [f] print(f == f) // false print(a == a) // true print(a == b) // false
Version:
swift-4.1.1-RELEASE
Output:
false true false
Error:
Avatar
t.ae 12-Jun-18 07:32 AM
これでいいんでしたっけ?
Avatar
omochimetaru 12-Jun-18 07:33 AM
@swiftbot
print(Float.nan == Float.nan)
(edited)
Avatar
koher 12-Jun-18 07:35 AM
あー、バッファが同じ場合は比較を省略してるのか。
Avatar
t.ae 12-Jun-18 07:35 AM
@swiftbot
let f = Float.nan let a = Optional(f) let b = Optional(f) print(f == f) // false print(a == a) // false print(a == b) // false
🛠 1
Avatar
swiftbot BOT 12-Jun-18 07:35 AM
Author icon t.ae
let f = Float.nan let a = Optional(f) let b = Optional(f) print(f == f) // false print(a == a) // false print(a == b) // false
Version:
swift-4.1.1-RELEASE
Output:
false false false
Error:
Avatar
t.ae 12-Jun-18 07:36 AM
Arrayだけおかしい気がする
Avatar
koher 12-Jun-18 07:36 AM
DictionarySet もおかしくなるんじゃない?
Avatar
omochimetaru 12-Jun-18 07:36 AM
ああ、 a== a のところがおかしいって言いたいのか。
Avatar
t.ae 12-Jun-18 07:36 AM
です。
Avatar
koher 12-Jun-18 07:37 AM
Optional は中身が一つしかないからそれの == を使うだろうけど、 DictionarySet だと Array と同じショートカットが行われてそう。
Avatar
omochimetaru 12-Jun-18 07:37 AM
うーん・・・
Avatar
t.ae 12-Jun-18 07:37 AM
Setもおかしいですね。
Avatar
omochimetaru 12-Jun-18 07:37 AM
そもそもFloatがEquatableの規約に違反してそう。
規約なんて無いけど
Avatar
koher 12-Jun-18 07:37 AM
これは Array のバグなのか、 Float の(というか IEEE の)問題なのか。
Avatar
omochimetaru 12-Jun-18 07:37 AM
Arrayが要素に期待する前提条件が
常に a == a であるとして設計されてそうだし
そうあっていいと思う
Avatar
koher 12-Jun-18 07:38 AM
こういうの考えても浮動小数点数の nan の仕様っておかしいよね。
Avatar
omochimetaru 12-Jun-18 07:38 AM
同値性
反射律。 (edited)
Equatableがここでいう「同値関係」を規定するのかによると思うけど
そうでないとしんどいよね。
Avatar
koher 12-Jun-18 07:41 AM
Equatable なのに equality じゃなくて equivalence なのか・・・。英語むずい・・・。
Avatar
t.ae 12-Jun-18 07:41 AM
バッファが同一ならequalというショートカットは要素の反射率を前提にしてますね。 ショートカット必要なんだろうか
Avatar
omochimetaru 12-Jun-18 07:41 AM
あったほうがいいでしょ。
プロパティが1万個ある構造体とかならでかいよ。
Avatar
koher 12-Jun-18 07:42 AM
かといって、 Float== を変えるのも難しいよね・・・。
1. この結果を受け入れる 2. Array 等のショートカットをやめる 3. Float 等の == を変える だけど。結局 1 にしかならなさそう。
Avatar
t.ae 12-Jun-18 07:43 AM
バッファが同一のときしかショートカットできないのでどのくらい働くのか微妙な気がしますが。
Avatar
omochimetaru 12-Jun-18 07:44 AM
@swiftbot
var d: [Float: String] = [:] d[.nan] = "a" d[.nan] = "b" d[.nan] = "c" print(d.count) print(d[.nan]) print(d == d)
🛠 1
Avatar
swiftbot BOT 12-Jun-18 07:44 AM
Author icon omochimetaru
var d: [Float: String] = [:] d[.nan] = "a" d[.nan] = "b" d[.nan] = "c" print(d.count) print(d[.nan]) print(d == d)
Version:
swift-4.1.1-RELEASE
Output:
3 nil true
Error:
/usercode/main.swift:6:7: warning: expression implicitly coerced from 'String?' to Any print(d[.nan]) ^~~~~~~ /usercode/main.swift:6:8: note: provide a default value to avoid this warning print(d[.nan]) ~^~~~~~ ?? <#default value#> /usercode/main.swift:6:8: note: force-unwrap the value to avoid this warning print(d[.nan]) ~^~~~~~ ! /usercode/main.swift:6:8: note: explicitly cast to Any with 'as Any' to silence this warning print(d[.nan]) ~^~~~~~ as Any
Avatar
koher 12-Jun-18 07:44 AM
いや、 3 もありな気がしてきた。
Avatar
t.ae 12-Jun-18 07:44 AM
時間かかるのが全要素equalのときなので自分自身との比較が一番時間かかることになってしまいますが (edited)
Avatar
omochimetaru 12-Jun-18 07:44 AM
バッファが同一のときしかショートカットできないのでどのくらい働くのか微妙な気がしますが。
コピーして回してる間にそうなることはあると思う
Avatar
koher 12-Jun-18 07:45 AM
いまって Int+ とかも純粋にハード的に計算してるわけじゃなくてオーバーフローチェックとか入れてるんだから
☝ 1
Avatar
omochimetaru 12-Jun-18 07:45 AM
例えば user.items = user2.items if user.items == user2.items { } とか。 (edited)
Avatar
koher 12-Jun-18 07:46 AM
&== を IEEE 754 に従った素の計算にして、 == だと反射率を満たすようにすればいい気が。
Avatar
t.ae 12-Jun-18 07:46 AM
&== 入れるなら == がIEEEに従う じゃないですか?
Avatar
koher 12-Jun-18 07:47 AM
==Equatable で規定されるものだから、 Equatable== が反射率を満たす必要があることを明記して
&==&+ 等と同様の余分なオーバーヘッドのない計算をしてくれる演算子でいいのでは?
Avatar
t.ae 12-Jun-18 07:49 AM
バッファチェック=オーバーヘッドか。それはそうですね。
Avatar
omochimetaru 12-Jun-18 07:49 AM
==でnanを比較したら死ぬとかは?
死ぬ分には定義を満たすことになる。
Avatar
koher 12-Jun-18 07:49 AM
普通に true でいいんじゃないかなぁ
Avatar
omochimetaru 12-Jun-18 07:49 AM
まあ == .nan とかかけたら便利か。
Avatar
koher 12-Jun-18 07:50 AM
他言語から来た人が死にそうだw (edited)
Avatar
omochimetaru 12-Jun-18 07:50 AM
他言語から来た人は == .nan 書かずに isNaN() を使うから大丈夫では
わかったうえで a != a を手書きするタイプの人だけ死にますね (edited)
Avatar
koher 12-Jun-18 07:50 AM
== .nan を見て、このコードバグってんぞ→バグってなかった!ってなりそう
Avatar
omochimetaru 12-Jun-18 07:51 AM
問題は
NaNにほぼならないとわかっているケースで
NaNチェック付きの実装になってしまうことで
パフォーマンスが落ちそうなことですね
Avatar
koher 12-Jun-18 07:51 AM
いや、それを言い出したら
Int+ だってそうでしょ?
FloatDouble== より Int+ を使う機会の方がずっと多いのでは?
CG とかだとそうとも限らない?でも +* は使っても == はそんなに使わなさそう。
だし、そもそも GPU 上で計算されてるか。
Avatar
omochimetaru 12-Jun-18 07:53 AM
オーバーフローするかどうかは足し算と同時にCPU命令一発で実行されるけど
Avatar
koher 12-Jun-18 07:53 AM
FloatDouble で、 CPU 上で計算してる時点でパフォーマンスにこだわるケースじゃなさそう。
Avatar
omochimetaru 12-Jun-18 07:53 AM
isNaNの自動チェックはコードで外側でやることになるから
その分の差がありそうだなと思って。
Avatar
Kishikawa Katsumi 12-Jun-18 07:53 AM
Equatableは反射律を満たしていたらOKなんですか?推移律は不要?
Avatar
koher 12-Jun-18 07:53 AM
オーバーフローするかどうかは足し算と同時にCPU命令一発で実行される
そうなのか・・・。
Avatar
omochimetaru 12-Jun-18 07:53 AM
はい、変なレジスタで結果が返ってくる。
Avatar
koher 12-Jun-18 07:54 AM
@Kishikawa Katsumi 全部満たしてないといけないと思います。
Avatar
omochimetaru 12-Jun-18 07:54 AM
ただ、いずれにせよ「計算後」に その、オーバーフローフラグを見る制御ロジックはSwiftレベルで実装されてるから
Avatar
Kishikawa Katsumi 12-Jun-18 07:54 AM
だとするとNan == Nanをtrueにすると推移律を満たさなくなるんじゃないかな。
Avatar
omochimetaru 12-Jun-18 07:54 AM
それを前にやっているだけで結局かわらない気もする
Avatar
t.ae 12-Jun-18 07:54 AM
例がnanだったので反射率を上げただけですね
Avatar
Kishikawa Katsumi 12-Jun-18 07:55 AM
結果Nanになるけど同じではないものはけっこうあるんじゃないか。
Avatar
t.ae 12-Jun-18 07:55 AM
(nan == nan) and (nan == nan) iff (nan == nan)では?
Avatar
omochimetaru 12-Jun-18 07:55 AM
それはnanを構成する式の段階との話ですかね
Avatar
koher 12-Jun-18 07:56 AM
Equatable はあくまで計算結果の値についてなので、成り立つように思います。
Avatar
t.ae 12-Jun-18 07:56 AM
ああ計算過程の話ですかね?
Avatar
Kishikawa Katsumi 12-Jun-18 07:57 AM
NaNに関しては、NaNになるXとYがあるとき、X == Yではないことはけっこうあるんじゃないか、ということです。
Avatar
omochimetaru 12-Jun-18 07:58 AM
NaNになるX の X が、 Float型の値じゃなくて、なんらかの計算式を想定しているなら、間違っています。
(10 / 2 ) == (20 / 4) なのに 10 と 20 は違う値だ 、みたいな。
Avatar
koher 12-Jun-18 07:59 AM
「 10 と 20 は違う値だ」より、「 10 / 2 と 20 / 4 」は異なる式だ、かな。
Equatable はあくまで値についての性質なので、どのような式で nan が導かれても推移律は満たされることになるかと。
Avatar
Kishikawa Katsumi 12-Jun-18 08:02 AM
それでいい気もしますね。
Avatar
koher 12-Jun-18 08:09 AM
@t.ae evolution に投げてみては?
Avatar
t.ae 12-Jun-18 08:10 AM
問題提起レベルでも投げていいんですっけ
Avatar
koher 12-Jun-18 08:11 AM
↑の三つの選択肢があると思うけどどう思う?くらいで Pitch として投げるならいいんじゃないかな?
こんな問題見つけたよ、だとバグレポートな気がするけど。
「どう思う?」というか、「修正が必要じゃない?」くらいのスタンスかな? (edited)
Avatar
t.ae 12-Jun-18 08:13 AM
じゃあちょっと書いてみます
👍 1
Avatar
t.ae 12-Jun-18 08:26 AM
調べてみたら似たようなのありますね。 https://forums.swift.org/t/rationalizing-floatingpoint-conformance-to-equatable/6861 a == aのケースについて話されてるかはこれから読みます。
Ben Cohen asked to continue this conversation on swift-dev-- Included in PR #12503 is a small tweak to accommodate so-called "exceptional values" (such as NaN) in comparisons of array equality. Currently, Array.== first looks to referential equality of underlying buffer...
Currently, Array.== first looks to referential equality of underlying
buffers, then (if false) compares elementwise equivalence as defined by Element.==. As a consequence, an array of NaN compares equal to another array of NaN if they share the same buffer, but otherwise false. This is an undesirable outcome. 頭から書いてあった🙃
👌 1
Avatar
koher 12-Jun-18 08:39 AM
The last time that this topic was brought up, competing demands voiced by different people were not possible to reconcile: 1) Equatable `==` must be a full equivalence relation. 2) Floating-point types must conform to `Equatable` and not to some alternative such as `PartiallyEquatable`. 3) Floating-point `==` must be IEEE-compliant (at least in the concrete context), and therefore *not* a full equivalence relation. 4) IEEE-compliant floating-point equivalence must be spelled `==` and not some alternative such as `&==`. 5) Behavior of `==` must not change between generic and concrete contexts.
Avatar
Nonchalant 15-Jun-18 02:04 PM
Swift runtimeでConditional Conformanceをサポートしてない問題なのですが、今後の対応予定とかってどこで見れるのでしょうか?🙇
protocol A { static func hoge() } struct B: A { static func hoge() { print("B") } } extension Optional: A where Wrapped: A { static func hoge() { print("Optional") } } struct F<T> { static func fuga() { switch T.self { case is A.Type: (T.self as! A.Type).hoge() default: fatalError() } } } F<B>.fuga() // B // warning: Swift runtime does not yet support dynamically querying conditional conformance F<B?>.fuga() // fatalError
(edited)
Avatar
ikesyo 15-Jun-18 02:07 PM
SE-0143はSwift 4.2をもってImplementedとなっていて、ランタイムチェックも4.2で実装されてます https://github.com/apple/swift-evolution/blob/master/proposals/0143-conditional-conformances.md
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
実装されたのは https://github.com/apple/swift/pull/14368 これで2月ですね
When evaluating whether a given type conforms to a protocol, evaluate the conditional requirements and pass the results to the witness table accessor function. This provides the ability to query co...
https://github.com/apple/swift/commit/87f7b4e5fb58cc32fd33144e5e4207d53d2e5745 このマージコミットを見ればどのタグから入っているか分かりますね
^ @Nonchalant
Avatar
Nonchalant 15-Jun-18 02:11 PM
@ikesyo ありがとうございます!すでに実装されてたんですね...探し方も教えていただいてありがとうございます!
swift-4.2-DEVELOPMENT-SNAPSHOT-2018-04-23-a
ここから入っているのか
Xcode 10で試してみます!
Avatar
ikesyo 15-Jun-18 02:13 PM
それは4.2のsnapshotが作られ始めたタイミングだと思うので、DEVELOPMENT-SNAPSHOTにはもっと前からあるはず
Xcode 10 beta 1では間違いなく入ってるはずです
Avatar
Nonchalant 15-Jun-18 02:14 PM
ありがとうございます!🙇
Avatar
yyu 16-Jun-18 06:32 PM
こんにちは! 自己宣伝で申し訳ないんですが、テスト用のダミーデータを作ってみるライブラリとそれに関する記事を書いてみました。Swift初心者なので、ぜんぜんアレかもしれませんが、感想を頂けたらすごくうれしいです。 https://qiita.com/yyu/items/e8f1b4a17dac4f9108a5
👀 4
Avatar
koher 16-Jun-18 11:34 PM
@yyu おもしろかったです😀こういうことを学ぼうとすると読みなれないHaskellとかでやることになるので、自分が親しんでいる言語で読めてとてもわかりやすかったです。 (edited)
Avatar
yyu 17-Jun-18 06:39 AM
おお。ありがたいですー。
Avatar
koher 17-Jun-18 07:36 AM
Swift だと HListHConsHNil に限定できないのが辛いですね。 enum でも書けなさそうだし・・・。
普通の List なら↓みたいに書けるんですけどね〜。
enum List<Element> { case `nil` indirect case cons(Element, List<Element>) } let a: List<Int> = .cons(2, .cons(3, .cons(5, .nil)))
(edited)
Avatar
yyu 17-Jun-18 10:16 AM
そうですね。enumが型パラメータを取れないと無理なんですよね……。
Avatar
norio_nomura 19-Jun-18 12:14 PM
ぬうう、canImportimportの様にシンボルを使う事は出来ないのか…。 @swift-nightly
import Foundation let killSignals: [Int32] = { var signals = [SIGILL, SIGTRAP, SIGABRT, SIGFPE, SIGBUS, SIGSEGV, SIGQUIT] #if canImport(Glibc.SIGSYS) signals.append(Glibc.SIGSYS) #endif return signals }()
(edited)
Avatar
swiftNightly BOT 19-Jun-18 12:14 PM
exit status: 1 with stderr:
<stdin>:4:5: error: unexpected platform condition argument: expected identifier #if canImport(Glibc.SIGSYS) ^
(edited)
Avatar
omochimetaru 29-Jun-18 07:54 AM
diffライブラリを自作して、 値型の配列がdidSetで更新されると、差分がUIViewに適応されるパターンを組んでみました。 Reactの最小の手動実装のような感じです。 https://github.com/omochi/SdiftExample
Contribute to SdiftExample development by creating an account on GitHub.
👍 4
Avatar
t.ae 02-Jul-18 01:52 AM
public struct Uniform { var base: RandomNumberGenerator init(base: RandomNumberGenerator) { self.base = base } /// Returns a value from uniform [low, high) distribution. public mutating func next(low: Float, high: Float) -> Float { let uint32: UInt32 = base.next() return (high - low) * (Float(bitPattern: uint32 >> 9 | 0x3f80_0000) - 1) + low } } extension RandomNumberGenerator { public var uniform: Uniform { return Uniform(base: self) } }
こういうの作ろうと思ったんですがRNGがstructだと内部状態コピーされるから微妙ですね……
(edited)
Avatar
koher 02-Jul-18 01:55 AM
next(range: Range<Float>)RandomNumberGenerator に生やすとか?
Avatar
t.ae 02-Jul-18 01:55 AM
normalもセットで作りたかったのでuniformに切り出したんです
Avatar
koher 02-Jul-18 01:58 AM
それも extension で追加してもいい気も (edited)
Avatar
t.ae 02-Jul-18 01:59 AM
next(range: Range<Float>)next(mu: Float, sigma: Float)だと分かりづらくないですかね?
Avatar
koher 02-Jul-18 02:00 AM
そうかな?そっちの方が使いやすそうな気も
RNGがstructだと内部状態コピーされる
これの問題はどこでしょう?コピーコスト?状態が複製される点?
Avatar
t.ae 02-Jul-18 02:01 AM
分布について引数からしかわからないのが微妙かと思うんですが。 他言語だとrandとrandnに分けたりしてますがRNGのインターフェースに合わない……
2つunifrom rngを作ったら内部状態がコピーされるので同じ乱数列が出てくるところですね (edited)
Avatar
koher 02-Jul-18 02:02 AM
まず、デフォルトの Randomstruct だけどそれは起こらないのと、
Avatar
t.ae 02-Jul-18 02:02 AM
Randomはそうですね。
Avatar
koher 02-Jul-18 02:02 AM
それが起こる RNG を実装した struct の場合
var a = FooRandom() var b = a a.next() == b.next() // true
になるんだから、 Uniform もそれでいいんじゃないかな?
あー
Avatar
t.ae 02-Jul-18 02:04 AM
もともと気をつけてつかってねってのがstruct RNGなのを前提としても uniformでコピーされるところがわかりにくいんじゃないかと
Avatar
koher 02-Jul-18 02:04 AM
var a = FooRandom() print(a.uniform.next(...) print(a.uniform.next(...)
これで同じのが出るのが嫌か。
Avatar
omochimetaru 02-Jul-18 02:06 AM
実際には同じものが出ないような?
Avatar
t.ae 02-Jul-18 02:06 AM
メルセンヌ・ツイスタとかだと出るはずです
Avatar
koher 02-Jul-18 02:07 AM
uniformget set なプロパティにして
Booltoggle とかと同じように元の struct に変更を反映できない?
Avatar
t.ae 02-Jul-18 02:07 AM
その発想はなかった。ちょっとやってみます
Avatar
koher 02-Jul-18 02:08 AM
setbaseself に代入すればいいのか。 (edited)
Avatar
omochimetaru 02-Jul-18 02:10 AM
そだね>MT (edited)
Avatar
t.ae 02-Jul-18 02:14 AM
うーんうまくいかない?
setで代入してるところには行ってるみたいなんですが
あ、うまくいってました。0, 1, 2...を生成するダミーを使ったからFloatにして[0, 1)区間だとprintしても全部0に見えてただけでした (edited)
🙂 1
Avatar
t.ae 02-Jul-18 02:30 AM
あーやっぱりだめでした。 書き戻しで何か変なことになってそう
@swift-4.2.4
swift public struct Uniform { var base: RandomNumberGenerator init(base: RandomNumberGenerator) { self.base = base } /// Returns a value from uniform [low, high) distribution. public mutating func next(low: Float, high: Float) -> Float { print("base before; \(base)") let uint32: UInt32 = base.next() print("base after; \(base)") return (high - low) * (Float(bitPattern: uint32 >> 9 | 0x3f80_0000) - 1) + low } } extension RandomNumberGenerator { public var uniform: Uniform { get { return Uniform(base: self) } set { print("before set: \(self)") self = uniform.base as! Self print("set self: \(self) \(uniform.base)") } } } struct DummyRNG: RandomNumberGenerator { static var `default` = DummyRNG.init() var state: UInt32 = 0 mutating func next<T>() -> T where T : FixedWidthInteger, T : UnsignedInteger { state += 123456789 return T(state) } } print(DummyRNG.default.uniform.next(low: 0, high: 1)) print(DummyRNG.default.uniform.next(low: 0, high: 1)) print(DummyRNG.default.uniform.next(low: 0, high: 1))
Avatar
swift42 BOT 02-Jul-18 02:31 AM
base before; DummyRNG(state: 0) base after; DummyRNG(state: 123456789) before set: DummyRNG(state: 0) set self: DummyRNG(state: 0) DummyRNG(state: 0) 0.02874446 base before; DummyRNG(state: 0) base after; DummyRNG(state: 123456789) before set: DummyRNG(state: 0) set self: DummyRNG(state: 0) DummyRNG(state: 0) 0.02874446 base before; DummyRNG(state: 0) base after; DummyRNG(state: 123456789) before set: DummyRNG(state: 0) set self: DummyRNG(state: 0) DummyRNG(state: 0) 0.02874446
Avatar
t.ae 02-Jul-18 02:32 AM
setに入ってくるuniformが変化前のになってる?
あ。馬鹿だ。uniformじゃなくてnewValue使わないと
大丈夫でした。
Avatar
t.ae 02-Jul-18 02:42 AM
完成品がこちらになります。 https://github.com/t-ae/rng-extension
rng-extension - Swift extension for RandomNumberGenerator
Avatar
koher 02-Jul-18 06:52 AM
プロトコル型で持たずに Uniform<Random : RandomNumberGenerator> にした方が Swifty じゃないですか?
Avatar
t.ae 02-Jul-18 06:53 AM
いままさにそれ考えてたんですけどextensionでself渡すところできるんですっけ?
RandomNumberGeneratorに生やすとそれ自体が適合してなくて云々みたいになるとおもうんですが
あれ?普通にできそうだな
Avatar
t.ae 02-Jul-18 07:35 AM
ジェネリックにしてみました。特定のRNGでextensionを生やせるようになって良い感じに
👍 1
Avatar
koher 02-Jul-18 08:28 AM
@t.ae basefileprivate にする PR 送ろうかと思ったら、逆に 1.0.0 から 1.0.1internalpublic な変更がされてるんですが、この意図は何でしょう?
あと、この変更は後方互換のある API の変更なので、 sem ver 的には 1.0.01.1.0 の変更だと思います。
Avatar
t.ae 02-Jul-18 08:29 AM
https://github.com/t-ae/xorswift/blob/swift4.2/Sources/Uniform.swift 外部に高速実装を生やすためにbaseを参照できるようにしました。 基本見えても問題ないはずなので…… (edited)
xorswift - Xorshift pseudorandom number generator library for Swift.
masterじゃなくて4.2ブランチだった
Avatar
koher 02-Jul-18 08:30 AM
そして、作った直後はこういう微妙な変更が発生しがちなので、しばらくは -alpha-beta, -beta.2 等を付けておくのがオススメです。
(あと、 1.0.0 から始めずに 0.1.0 から始めた方が気軽に破壊的変更しやすいです。)
Avatar
t.ae 02-Jul-18 08:30 AM
アルファつけるの忘れてましたねぇ。x.x.15とかいってるのもあるので覚えておくようにします。
Avatar
koher 02-Jul-18 08:32 AM
patch は API の変更はないバグ修正なので、 API の修正は互換性があってもマイナーを、互換性がないとメジャーを上げないといけないので辛いです・・・。
↓これも base を外部から使ってなくないですか? https://github.com/t-ae/xorswift/blob/swift4.2/Sources/Uniform.swift
xorswift - Xorshift pseudorandom number generator library for Swift.
Avatar
t.ae 02-Jul-18 08:33 AM
0.0.xでいつもはやってたんですけどね、いつまでも1にならないので……
base.xとかが出てきます
Avatar
koher 02-Jul-18 08:33 AM
あるあるですねw < いつまでも 1 にならない
しかし、 1.0.0 というのはそれだけの重みがあることの裏返しな気も
Swift の 1.0 はおかしかったけど、 Kotlin とかずいぶん長い間 1.0 にならなかったし。
あー、 .base で検索してた😅
Avatar
t.ae 02-Jul-18 08:35 AM
ある程度安定してから1.0.0にするのが良かったですね。今回は思いつきで他のライブラリと統合したのでタイミングが悪かった感じです
Avatar
t.ae 02-Jul-18 10:23 AM
あらためてRandomのプロポーザル見てるとFloat.random(in:)がありましたね。 normalもこっちの形式に揃えるほうがいいんだろうか……
Avatar
koher 05-Jul-18 06:52 AM
Qiita で通知が来て 2014 年のコメントが発掘されたけど、何もかも古くておもしろかった。 https://qiita.com/Kenya/items/dced88c4508302786f24#comment-a88dbd8e88cf31abf996
俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで Braian になっちゃった。 ##mapを使用した変換 ``` var numbersString: [St...
Avatar
omochimetaru 05-Jul-18 06:54 AM
toInt
Avatar
koher 05-Jul-18 06:54 AM
今だったら strings.compactMap(Int.init) で、 flatMap 以前なので 3 週古くて(リネーム前の flatMapArray を返す flatmapreduce
reduce 使うにしても今だったら reduce(into:_:) だし。
Avatar
koher 05-Jul-18 08:46 AM
@swiftbot
let a = [[2], [3 ,5]] for var (i, numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
🛠 1
Avatar
swiftbot BOT 05-Jul-18 08:46 AM
Author icon koher
let a = [[2], [3 ,5]] for var (i, numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
Version:
swift-4.1.1-RELEASE
Output:
0: [2, 3] 1: [3, 5, 3]
Error:
/usercode/main.swift:3:10: warning: variable 'i' was never mutated; consider changing to 'let' constant for var (i, numbers) in a.enumerated() { ^
Avatar
koher 05-Jul-18 08:47 AM
↑の warning 出なくする方法ってありますか? numbersvar に、 ilet にしたい。
あー、ちがう
これはできる
@swiftbot
let a = [[2], [3 ,5]] for (i, var numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
🛠 1
Avatar
swiftbot BOT 05-Jul-18 08:49 AM
Author icon koher
let a = [[2], [3 ,5]] for (i, var numbers) in a.enumerated() { numbers.append(3) print("\(i): \(numbers)") }
Version:
swift-4.1.1-RELEASE
Output:
0: [2, 3] 1: [3, 5, 3]
Error:
Avatar
koher 05-Jul-18 08:52 AM
↓こっち。 Optional binding で varlet に bind したい。 @swiftbot
let a = [[2], [3 ,5]] var iterator = a.enumerated().makeIterator() if var (i, numbers) = iterator.next() { numbers.append(0) print("\(i): \(numbers)") }
🛠 1
Avatar
swiftbot BOT 05-Jul-18 08:52 AM
Author icon koher
let a = [[2], [3 ,5]] var iterator = a.enumerated().makeIterator() if var (i, numbers) = iterator.next() { numbers.append(0) print("\(i): \(numbers)") }
Version:
swift-4.1.1-RELEASE
Output:
0: [2, 0]
Error:
/usercode/main.swift:4:9: warning: variable 'i' was never mutated; consider changing to 'let' constant if var (i, numbers) = iterator.next() { ^
Avatar
rintaro 05-Jul-18 08:53 AM
if case (let i, var numbers)? = iterator.next() {
Avatar
koher 05-Jul-18 08:56 AM
あー、なるほど! case にしちゃえばいいのか。ありがとうございます!
Avatar
t.ae 09-Jul-18 12:53 AM
https://github.com/apple/swift/blob/master/stdlib/public/core/Integers.swift.gyb#L2939-L2956 このアンスコ付き_random()random(in: UnboundedRange)にしたら?って提案しようかと思うんですがこういう細かい&そもそもまだ固まってない内容もフォーラムにスレッド立てていいんですかね? RandomUnificationのスレはちょっと古くて……
swift - The Swift Programming Language
Avatar
koher 09-Jul-18 01:24 AM
@t.ae Random Unification はすでに implemented だから別スレで問題ないんじゃないでしょうか。 random(in: UnboundedRange) は新しい API の提案だし、 reduce(into:_:)togglecompactMapValues を考えると、単独の API の提案は全然ありな気がします。
最終的には FixedWidthInteger に限らず検討することになるかもしれないにしても、 pitch は気軽に投げていいんじゃないでしょうか。
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
t.ae 09-Jul-18 02:22 AM
On master branch, we have FixedWidthInteger._random() function for sampling random numbers from full range. I think we should have FixedWidthInteger.random(in: UnboundedRange) for this purpose. There is FixedWidthInteger.random(in: Range) function. So adding UnboundedRange...
Discussionタグは割とラフに提案できそうだったのでそれで
Avatar
koher 26-Jul-18 01:08 AM
<.. がほしくなった。
↓がしたくなったら
struct Foo { var bar: Bar { mutating get { ... } } }
↓に書き換えた方がいいでしょうか?
struct Foo { mutating func bar() -> Bar { ... } }
Avatar
rintaro 26-Jul-18 01:15 AM
目的によると思いますが、キャッシュ的なものですか?
Avatar
koher 26-Jul-18 01:21 AM
get されてから lazy に読み込んでキャッシュしたいケースです。
Avatar
rintaro 26-Jul-18 01:26 AM
var foo1 = Foo() var foo2 = foo1 var bar = foo2.bar
というときに、foo1 にキャッシュが共有されないというのが許容出来る場合、僕なら mutating func bar() にします。
許容できないなら class にするか、グローバルにキャッシュを持つしかない。
Avatar
tarunon 26-Jul-18 01:29 AM
素直にclassにした方が良さそうな気はします
class+lazy varがシンプルに感じる
Avatar
koher 26-Jul-18 01:32 AM
キャッシュが共有されないこと自体はいいんですが、今のケースではクラスにしないとまずい気がしてきました。
Avatar
Kuniwak 06-Aug-18 11:11 AM
なかなかファニーなエラーが出るのですが、これ何が原因なんでしょう。基本的には健全なコードだと感じますが:
protocol P { associatedtype T func f(_ g: @escaping (T) -> Void) } class C<S>: P { typealias T = S private let _f: ((S) -> Void) -> Void init<Q: P>(q: Q) where Q.T == T { // Error: cannot assign value of type '((S) -> Void) -> Void' to type '((S) -> Void) -> Void' self._f = { g -> Void in q.f(g) } } func f(_ g: @escaping (S) -> Void) { self._f(g) } }
🍰 1
Avatar
tarunon 06-Aug-18 11:14 AM
protocol P { associatedtype T func f(_ g: @escaping (T) -> Void) } class C<S>: P { typealias T = S private let _f: (@escaping (S) -> Void) -> Void init<Q: P>(q: Q) where Q.T == T { // Error: cannot assign value of type '((S) -> Void) -> Void' to type '((S) -> Void) -> Void' self._f = { g -> Void in q.f(g) } } func f(_ g: @escaping (S) -> Void) { self._f(g) } }
どぞ
Avatar
Kuniwak 06-Aug-18 11:15 AM
あ、そこも escaping つくのか。。。
ありがとうございます、明白だと勘違いしてました
Avatar
tarunon 06-Aug-18 11:16 AM
cannot assign value of typeのエラーわかりにくい問題、最新のXcodeだと治ってて一発でわかりますよ
Avatar
Kuniwak 06-Aug-18 11:16 AM
お、なるほど
あー、9.4.1 でした
ということは、Beta の方ですか?
Avatar
tarunon 06-Aug-18 11:16 AM
すんませんぱちこいた
なんで俺は一瞬で見抜いたんだ
Avatar
Kuniwak 06-Aug-18 11:16 AM
ww
Avatar
tarunon 06-Aug-18 11:17 AM
何度試しても同じエラーです、なんでわかったんだ。。。
Avatar
Kuniwak 06-Aug-18 11:17 AM
天のお告げ
Avatar
omochimetaru 06-Aug-18 11:17 AM
ディスコで既出だからでは?
Avatar
tarunon 06-Aug-18 11:17 AM
既出だったっけ
Avatar
omochimetaru 06-Aug-18 11:17 AM
うん。
Avatar
tarunon 06-Aug-18 11:18 AM
ざっくり見たことある気はするけど、にしても@escaping入れなきゃいけない位置を秒で特定できたのはちょい謎
Avatar
Kuniwak 06-Aug-18 11:18 AM
_f が escaping なの明白だからという流れで、引数側も明白だと勘違いした感じですね… 引数は明白じゃないのは落ち着いて考えないとわからなかったです
Avatar
tarunon 06-Aug-18 11:18 AM
いや、@escaping必要だって、、わいのXcodeは表示したんや…そのはずや…
Avatar
omochimetaru 06-Aug-18 11:19 AM
改善のコントリビュートしよう
Avatar
Kuniwak 06-Aug-18 11:20 AM
これは、どこでしょうね。エラーの文字列化のときに escaping の表示が外れてる匂いがしますが、コード追ったことないんで見に行ってきます
🚗 1
Avatar
Kuniwak 06-Aug-18 11:29 AM
このトピック #swift-contrib 感あるので移動します
Avatar
Kuniwak 09-Aug-18 06:16 AM
最近気付いたんですが、self の再宣言で LLDB 壊れますね
class Example { func ok() { let f = { [weak self] in guard let strongSelf = self else { return } // Set a breakpoint at here print(strongSelf) } f() } func error() { let f = { [weak self] in guard let `self` = self else { return } // Set a breakpoint at here print(self) } f() } } Example().ok() Example().error()
😲 1
(lldb) br set --file example.swift --line 7 Breakpoint 1: where = example`closure #1 () -> () in example.Example.ok() -> () + 111 at example.swift:7, address = 0x00000001000017df (lldb) br set --file example.swift --line 18 Breakpoint 2: where = example`closure #1 () -> () in example.Example.error() -> () + 111 at example.swift:18, address = 0x00000001000019cf (lldb) r Process 6298 launched: '/Users/yuki.kokubun/Development/self-self-lldb/example' (x86_64) Process 6298 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x00000001000017df example`closure #1 in Example.ok(self=0x0000000100802b30) at example.swift:7 4 guard let strongSelf = self else { return } 5 6 // Set a breakpoint at here -> 7 print(strongSelf) 8 } 9 10 f() Target 0: (example) stopped. (lldb) po self ▿ Optional<Example> - some : <Example: 0x100802b30> (lldb) c Process 6298 resuming example.Example Process 6298 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1 frame #0: 0x00000001000019cf example`closure #1 in Example.error(self=0x0000000100a01030) at example.swift:18 15 guard let `self` = self else { return } 16 17 // Set a breakpoint at here -> 18 print(self) 19 } 20 21 f() Target 0: (example) stopped. (lldb) po self error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it var $__lldb_error_result = __lldb_tmp_error ~~~~^~~~~~~~~~~~~~~~~~~~ _ error: <EXPR>:18:5: error: value of type 'Example' has no member '$__lldb_wrapped_expr_2' $__lldb_injected_self.$__lldb_wrapped_expr_2( ^~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
この場合、fr var は下のようになるので単純な名前ベースでの解決をしようとすると死ぬのが原因…?
(lldb) fr var (@lvalue example.Example?) self = 0x0000000100a01030 (example.Example) self = 0x0000000100a01030 {}
Avatar
Kuniwak 09-Aug-18 06:26 AM
これは strongSelf の方がデバッグしやすくていいなぁ、とか思いました
Avatar
Kishikawa Katsumi 09-Aug-18 06:39 AM
簡単なものだったらself?. で書くか、 クロージャの中で必要な変数をそれぞれguardでアンラップする、って感じに最近はしてますね。
guard let `self` = self else { return }
^ のところをselfじゃなくて、selfの先を3〜4つアンラップする感じd。
それかあらかじめローカル変数に受けるだけどそれは使えないことも多い。
😃 1
Avatar
tarunon 09-Aug-18 06:40 AM
必要な変数をunwrap、良いんですがfunctionがきつい…と思ったけどfunctionもアンラップ出来るのでは!?
guard let fooMethod = self?.fooMethod else
動きそう
Avatar
omochimetaru 09-Aug-18 06:41 AM
その左辺のfooMethodが内部でselfをキャプチャしてるのがちょっと怖い (edited)
Avatar
tarunon 09-Aug-18 06:42 AM
此奴を又貸ししたら崩壊しますね
Avatar
omochimetaru 09-Aug-18 06:42 AM
うむ。岸川さんのやつだと、又貸しセーフなので。
Avatar
tarunon 09-Aug-18 06:42 AM
まあでも結局それってmap(fooMethod)が崩壊するいつものやつで
Avatar
Kishikawa Katsumi 09-Aug-18 06:43 AM
guard let self = self else { return } <= これは見た目美しいけどトラブルが多いので良くない、 strongSelf <= これは人によって色々だしどう書いても美しくない、
Avatar
tarunon 09-Aug-18 06:43 AM
こっちもコンパイラで防ぐ仕組みはいってないからどうしようもないかなぁ
Avatar
omochimetaru 09-Aug-18 06:43 AM
(まあ又貸し先でselfは消えたけど又貸ししたオブジェクトは生きてて処理続行が正なのかは微妙だけど)
Avatar
tarunon 09-Aug-18 07:16 AM
functionの是非はさておき、書き味めちゃくちゃ良いです。知れて良かった、ありがとうございます。
Avatar
koher 09-Aug-18 08:12 AM
Error のインスタンスが手元にあるときに、それでクラッシュさせる ( try! に失敗したのと同じ状態にする)簡単な方法ってありますっけ? fatalError("\(error)") でもいいのかもしれませんが、 Error から String に情報が落ちてしまってますし。
Avatar
omochimetaru 09-Aug-18 08:13 AM
try! throw error
Avatar
koher 09-Aug-18 08:13 AM
try ! { throw error }() だと Never でないので guard で使えないですし。
Avatar
omochimetaru 09-Aug-18 08:13 AM
おおなるほど
Avatar
koher 09-Aug-18 08:14 AM
try! throw errorthrow が関数じゃないからできなくない?
internal func fatalError<E: Error>(with error: E) -> Never { try! { throw error }() fatalError("Never reaches here.") }
という微妙なユーティリティ関数を作ろうとしたけどもっといい方法はないかなと。
Avatar
omochimetaru 09-Aug-18 08:15 AM
↑自分の知見もそこまでです
Avatar
koher 09-Aug-18 08:17 AM
Java だと throw new RuntimeException(exception); とかでいいんだけど。
( Swift でも Logic failure なら fatalError じゃなくて preconditionFailure がいいかな。 precondition なのか微妙だけど。)
Avatar
rintaro 09-Aug-18 08:19 AM
https://github.com/apple/swift/blob/d30aa32001227a860706d4b475352c46fc57b4dc/stdlib/public/core/ErrorType.swift#L180-L186 っちゅうわけなので、String(reflecting: error) で同等みたいです。
swift - The Swift Programming Language
🙏 1
Avatar
omochimetaru 09-Aug-18 08:20 AM
_unexpectedError の返り値の型は Never ではないのですね
swift_unexpectedError が呼ばれる命令が直接 emit されるのかな
Avatar
koher 09-Aug-18 08:25 AM
invoke って call と同じような意味かと思ってたけど、 "Invoked by the compiler" ってことは、ランタイム時にコンパイラ関係ないから、コンパイラが使う(コンパイル時にこの関数を呼び出すコードを差し込む)というようなニュアンス?
Avatar
koher 09-Aug-18 08:36 AM
一周回ってよくわからなくなった。 call にしても、関数を呼び出す主語は何だろう?プログラマ?コード?(その関数を呼び出す行が書かれている)関数?実行しているプログラム?
Avatar
koher 09-Aug-18 09:39 AM
CMSampleBuffer ってメソッドが何もなくて https://developer.apple.com/documentation/coremedia/cmsamplebuffer
CMSampleBufferGetImageBuffer(_:) みたいな関数群があるけど https://developer.apple.com/documentation/coremedia/1489236-cmsamplebuffergetimagebuffer
これらをひたすら呼び出す extension を作ってメソッド化して↓に突っ込めば良い? https://github.com/apple/swift/tree/master/stdlib/public/SDK/CoreMedia
swift - The Swift Programming Language
Avatar
norio_nomura 21-Aug-18 10:37 AM
EvolutionのReview開始ってAnnouncementsに流れなくなったのかな? https://forums.swift.org/c/evolution/announce
This category is for announcements of Swift evolution proposal reviews and results, as well as other administrative announcements. Creation of new topics in this category is by site admins and Swift Core Team members only, although anyone can reply to topics once created.
SE-0223, SE-0224, SE-0225の開始がAnnouncementsに流れてなくて気づかなかった。
あれ?Review開始は随分前からAnnouncementsに流れてなかったのか。気づいてなかった…
Avatar
Kuniwak 24-Aug-18 06:42 AM
そういや、すごい基本的なところお伺いしたいんですが、DispatchQueue 経由でメインスレッド以外の処理を実行するコードがあったとして、そのスレッドを breakpoint で止めたとき、この thread がどこのコードによって生成されたかってわかるのでしょうか?
Avatar
omochimetaru 24-Aug-18 06:42 AM
Xcode+DispatchQueueだと表示されてますね
asyncメソッドに投入する側の、投入するまでのスタックトレースが
繋がって表示されます。
Avatar
Kuniwak 24-Aug-18 06:42 AM
なるほど、
Avatar
omochimetaru 24-Aug-18 06:42 AM
仕組みはよく知らないです。
あ、スレッドが生成されたかどうかは、わからないですね。
Avatar
Kuniwak 24-Aug-18 06:43 AM
JS でも似たような問題があって処理系が超頑張ってた覚えがあるのですが、Swift も同じような感じなのかな
Avatar
omochimetaru 24-Aug-18 06:43 AM
原理的には
投入するメソッドでスタックトレースを読み取って
投入先のスレッドのスレッドローカルストレージとかに
それをしまっておけばできる・・・?
Avatar
Kuniwak 24-Aug-18 06:44 AM
やっぱそんな感じになりますよね
Avatar
omochimetaru 24-Aug-18 06:44 AM
多重に往復した場合にもうまくいくようになんか工夫が必要そうですが、
Avatar
Kuniwak 24-Aug-18 06:44 AM
Apple の NSTread のドキュメント見た感じだと、普通に触るところには露出してなさそうだったので諦めてました
Avatar
omochimetaru 24-Aug-18 06:44 AM
あー
Xcodeのその仕組に対応したスタックトレースをまたいでつなげるやつを
Avatar
Kuniwak 24-Aug-18 06:45 AM
あ、NSThread じゃなくて普通に Thread だった
Avatar
omochimetaru 24-Aug-18 06:45 AM
自前の非同期機構に搭載する方法は謎ですね。
Avatar
Kuniwak 24-Aug-18 06:45 AM
あ、今回は DispatchQueue のやつなので、自前ではないんです
Avatar
omochimetaru 24-Aug-18 06:46 AM
それならDispatchqueueの仕組みで自然と対応されません?
Avatar
Kuniwak 24-Aug-18 06:48 AM
DispatchQueue.global(qos: .default).async { // この中で [NSException raise] が呼ばれていて、 // breakpoint set -S raise で止まった状態を想定してください。 // ここで、この doSomething を呼び出す task を誰が追加したのか // 追跡したい感じです。 doSomething() }
一応認識合わせのためにコード書いて見ました
Xcode では試してないのですが、AppCode では pthread 生成のコードが callstack の底にあったので、呼び出し元がわからない感じになってました
Avatar
omochimetaru 24-Aug-18 06:53 AM
stack
Xcodeだとこういう感じです。
Avatar
Kuniwak 24-Aug-18 06:53 AM
うぉ、ほんとだ
ちなみに、この時の (lldb) th b の結果はおそらく上だけな感じですよね?
これどうやってるんだ、、、
Avatar
omochimetaru 24-Aug-18 06:54 AM
(lldb) th backtrace * thread #3, queue = 'com.apple.root.default-qos', stop reason = breakpoint 1.1 frame #0: 0x000000010e89e001 libobjc.A.dylib`objc_exception_throw frame #1: 0x000000010f2090b9 CoreFoundation`-[NSException raise] + 9 * frame #2: 0x000000010df90ea6 StackChain`doInnerSomething() at ViewController.swift:8 frame #3: 0x000000010df90e19 StackChain`doSomething() at ViewController.swift:4 frame #4: 0x000000010df910c9 StackChain`closure #1 in ViewController.onButton() at ViewController.swift:14 frame #5: 0x000000010df910fd StackChain`thunk for @escaping @callee_guaranteed () -> () at ViewController.swift:0 frame #6: 0x000000011359b7ab libdispatch.dylib`_dispatch_call_block_and_release + 12 frame #7: 0x000000011359c7ec libdispatch.dylib`_dispatch_client_callout + 8 frame #8: 0x00000001135a1619 libdispatch.dylib`_dispatch_queue_override_invoke + 1451 frame #9: 0x00000001135a836c libdispatch.dylib`_dispatch_root_queue_drain + 664 frame #10: 0x00000001135a8076 libdispatch.dylib`_dispatch_worker_thread3 + 132 frame #11: 0x0000000113ac7169 libsystem_pthread.dylib`_pthread_wqthread + 1387 frame #12: 0x0000000113ac6be9 libsystem_pthread.dylib`start_wqthread + 13 (lldb)
ほんとですね。
Avatar
Kuniwak 24-Aug-18 06:54 AM
てことは Xcode が何やら裏側でやっているのか。。。
Avatar
omochimetaru 24-Aug-18 06:54 AM
lldbの外でやってるのか。
Avatar
Kuniwak 24-Aug-18 07:06 AM
む、、、これよくみたら frame #3 に変なの載ってますね。StackChain って語感からすると、別スレッドの退避された環境を戻すためのもの…?
Avatar
omochimetaru 24-Aug-18 07:07 AM
StackChain、というのは僕がつけたプロジェクト名です
Avatar
Kuniwak 24-Aug-18 07:07 AM
あ、なるほど w
これ、UI を main thread 以外で触って怒られた時のデバッグで頻出するパターンなんですが、AppCode でやりづらいのはつらいので機能要望をあげておきます
Avatar
norio_nomura 24-Aug-18 09:37 AM
thread backtrace -e trueでEnqueued from…の内容も見られますね。
Avatar
Kuniwak 24-Aug-18 09:42 AM
(lldb) h th b Show thread call stacks. Defaults to the current thread, thread indexes can be specified as arguments. Use the thread-index "all" to see all threads. Use the thread-index "unique" to see threads grouped by unique call stacks. Syntax: Command Options Usage: thread backtrace [-c <count>] [-s <frame-index>] [-e <boolean>] -c <count> ( --count <count> ) How many frames to display (-1 for all) -e <boolean> ( --extended <boolean> ) Show the extended backtrace, if available -s <frame-index> ( --start <frame-index> ) Frame in which to start the backtrace
なんと、超便利オプションだ…
@norio_nomura ありがとうございます
🙂 1
Avatar
omochimetaru 24-Aug-18 09:42 AM
extended backtrace!
Avatar
Kuniwak 24-Aug-18 09:43 AM
まったく存在に気づいていなかったw
Avatar
norio_nomura 24-Aug-18 09:43 AM
/usr/lib/system/introspectionを使った機能みたいです。
Avatar
Kuniwak 24-Aug-18 09:44 AM
$ ls /usr/lib/system/introspection libdispatch.dylib* libsystem_pthread.dylib*
なるほど、これは
* @discussion * These hooks are only available in the introspection version of the library, * loaded by running a process with the environment variable * DYLD_LIBRARY_PATH=/usr/lib/system/introspection
なるほど、LD_PRELOAD 的なので差し込まれるのか
ありがとうございます
Avatar
norio_nomura 24-Aug-18 09:50 AM
Xcodeは勝手に面倒を見てくれますが、ターミナルからlldbを直接起動する場合とかは自分で設定する必要があるみたいです。
Avatar
Kuniwak 24-Aug-18 09:51 AM
あー、なるほど
そして AppCode では話題にも上がっていないっぽいw
てことは、Scheme の環境変数に自前で追加してあげないとダメっぽいですね
一応後で AppCode の LLDB で target module list かけてみて libdispatch.dylib が本物っぽいかどうかだけ確認してみます
もし面倒見てくれてたら別なの見てると思うので
Avatar
norio_nomura 24-Aug-18 09:55 AM
試しにprocess launch -v DYLD_LIBRARY_PATH=/usr/lib/system/introspection/usr/lib/system/introspection/libdispatch.dylibをロードしただけでは、thread backtrace -e trueは意図した通りに動きませんでした。 🤔
Avatar
Kuniwak 24-Aug-18 09:55 AM
なるほど、なんでしょうね、まだ必要な操作があるのか…
Avatar
norio_nomura 24-Aug-18 10:50 AM
/Applications/Xcode.app/Contents/Developer/usr/lib/libBacktraceRecording.dylibってのをlldb-rpc-serverは使ってるけど、lldb
plugin load /Applications/Xcode.app/Contents/Developer/usr/lib/libBacktraceRecording.dylib
してもダメだった。
(edited)
Avatar
norio_nomura 24-Aug-18 12:04 PM
process launch -v DYLD_LIBRARY_PATH=/usr/lib/system/introspection -v DYLD_INSERT_LIBRARIES=/Applications/Xcode.app/Contents/Developer/usr/lib/libBacktraceRecording.dylib
でイケた。
Avatar
Avatar
norio_nomura 28-Aug-18 03:44 AM
swift -frontend -replなんてのがあったのね。
$ swift -frontend -repl *** You are running Swift's integrated REPL, *** *** intended for compiler and stdlib *** *** development and testing purposes only. *** *** The full REPL is built as part of LLDB. *** *** Type ':help' for assistance. *** (swift) :help Available commands: :quit - quit the interpreter (you can also use :exit or Control+D or exit(0)) :autoindent (on|off) - turn on/off automatic indentation of bracketed lines :constraints debug (on|off) - turn on/off the debug output for the constraint-based type checker :dump_ir - dump the LLVM IR generated by the REPL :dump_ast - dump the AST representation of the REPL input :dump_decl <name> - dump the AST representation of the named declarations :dump_source - dump the user input (ignoring lines with errors) :print_decl <name> - print the AST representation of the named declarations :print_module <name> - print the decls in the given module, but not submodules API documentation etc. will be here eventually. (swift)
Avatar
omochimetaru 28-Aug-18 03:45 AM
$ swift のときに突入するのがそれだと思ってました (edited)
Avatar
norio_nomura 28-Aug-18 03:46 AM
普通のREPLには無い機能ばかりです。lldbを使わないので、--privileged無しのdockerでも使える。
Avatar
omochimetaru 28-Aug-18 03:46 AM
そうなのか!
lldbを使わないので、--privileged無しのdockerでも使える。
これ地味にいいですね。
Avatar
norio_nomura 28-Aug-18 03:48 AM
Herokuが--privileged無しdockerなので、Herokuで動いてるSwiftボットでも、修正すれば使える様になりそう。
Avatar
rintaro 28-Aug-18 03:48 AM
swift -deprecated-integrated-repl がそれですね。
Avatar
omochimetaru 28-Aug-18 03:48 AM
deprecatedw
[omochi@omochi-iMac-PC43 bne-loci (master *+=)]$ swift -deprecated-integrated-repl *** You are running Swift's integrated REPL, *** *** intended for compiler and stdlib *** *** development and testing purposes only. *** *** The full REPL is built as part of LLDB. *** *** Type ':help' for assistance. *** (swift) ^D [omochi@omochi-iMac-PC43 bne-loci (master *+=)]$ swift Welcome to Apple Swift version 4.2 (swiftlang-1000.0.36 clang-1000.0.4). Type :help for assistance. 1> ^D [omochi@omochi-iMac-PC43 bne-loci (master *+=)]$ swift -frontend -repl *** You are running Swift's integrated REPL, *** *** intended for compiler and stdlib *** *** development and testing purposes only. *** *** The full REPL is built as part of LLDB. *** *** Type ':help' for assistance. *** (swift) ^D
-frontend -repl のほうが -deprecated-integrated-repl か・・・
Avatar
norio_nomura 28-Aug-18 03:50 AM
使えて意味がありそうなのはprint_declprint_moduleくらいだけど、どれも出力が大きくなるからボットで使えてもありがたみが薄いかな?
Avatar
norio_nomura 28-Aug-18 04:55 AM
@swift-4.2.4 -frontend -repl
:print_decl Equatable
Avatar
swift42 BOT 28-Aug-18 04:55 AM
protocol Equatable { static func == (lhs: Self, rhs: Self) -> Bool } extension Equatable { @inlinable static func != (lhs: Self, rhs: Self) -> Bool }
Avatar
norio_nomura 28-Aug-18 04:55 AM
-frontend -replサポート出来た。
Avatar
norio_nomura 28-Aug-18 09:37 AM
https://swift.org/download/#snapshotsswift-DEVELOPMENT-SNAPSHOT-2018-08-26-a があるけど https://github.com/apple/swift/tags にタグが無いな。gitで見ても無さげ。
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
新しいツールチェインの検出をGitHubのAPIに頼ってるから、swift.orgだけに現れても検出できない…
Avatar
koher 29-Aug-18 02:49 AM
Go 2 のエラーハンドリングのドラフト、 Swift のエラーハンドリングについても言及されてる。 https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md
😀 1
Avatar
tarunon 29-Aug-18 02:50 AM
結構よさそう
Avatar
omochimetaru 29-Aug-18 02:51 AM
Swiftのtryオペレータみたいにcheck命令を書くんですね
handleスコープをメソッド冒頭にもかけるのはSwiftに無い機能だな
Avatar
tarunon 29-Aug-18 02:51 AM
Genericsもあるらしいんですがこれであってますかね? https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md
Avatar
omochimetaru 29-Aug-18 02:52 AM
これはprotocolみたいなやつじゃない?
Avatar
tarunon 29-Aug-18 02:52 AM
Generics名乗ってはいるんですよね
overviewは↑だった
Avatar
omochimetaru 29-Aug-18 02:53 AM
ただのGenericsだと、
その型パラメータに何ができるのってことがわからないから
型パラメータの型を制約して呼び出せるメソッドとかを宣言しないと意味がなくて
Javaだと T: Hoge みたいに書けるけど、
その継承縛りだけだとできない事も出てくるからSwiftのprotocolみたいなものが必要になってきて
それがGoだとcontractなのではなかろうか
C++も同様の問題があって concept という言語機能が検討されている
Avatar
tarunon 29-Aug-18 02:55 AM
ふむふむ
Avatar
koher 29-Aug-18 02:55 AM
動的型付言語から静的型付言語に揺り戻しが来たように、暗黙的エラーから明示的エラーに揺り戻しが来てんのかな。 Java が面倒過ぎた反動で動的・暗黙的に偏りすぎたけど、本来的には必要なものだったから改善して戻ってきたみたいな? (edited)
Avatar
omochimetaru 29-Aug-18 02:55 AM
Goにちゃんとした型制約が提案されてるのは意外だけど。
もっとやるとしてもC++ライクな適当なジェネリクスというかコンパイル時ダックタイピング的なものになるかとおもた
あーでもジェネリッククラス自体をコンパイルするときにはヒントが足りないからこういう宣言機構がやっぱり必要なのかな。
どうなんでしょう、Goはもともと明示的エラーハンドリングが強く推奨されていたから
揺り戻すというよりGoはもともとそうだったという感じがします
Avatar
koher 29-Aug-18 02:59 AM
Go がというよりも、暗黙的一辺倒だったのが最近明示的が増えてきたことに対して。
この冒頭に handle 書くの、気持ち悪い気がしたけど defer 的な気持ちで見れば良いのか。
全体を do/catch で囲まなくてよいのでネストが深くならないのが良い?
Avatar
omochimetaru 29-Aug-18 03:03 AM
Guidelines for using language features to write maintainable code.
フラッタ〜に採用されとるDart2を見てるけど
動的例外な気がする
Avatar
koher 29-Aug-18 03:04 AM
finally を採用せずに defer にしたんだったら、この handle みたいなのの方が理に適ってる気がするけどどうだろう? (edited)
Avatar
omochimetaru 29-Aug-18 03:05 AM
個人的にはcatchするとdoが必要でネストするのが嫌いなのでこのネストしないhandleは良いなと思ったけど
deferがあるなら、という理由で理に適ってるという理屈はよくわからないです
特に、catchスコープの後ろに文が書けるけど、handleだとそれができなそう。
Avatar
tarunon 29-Aug-18 03:10 AM
これコードブロックの解析面倒くさそうだなって思ったんですが、swiftよろしく同一func内に複数handleを書こうとすると、それは無理だったりするのかな
Avatar
omochimetaru 29-Aug-18 03:10 AM
このhandleはfunc内のエラーを全部捕まえそうに見える
Avatar
tarunon 29-Aug-18 03:10 AM
都度handleで綺麗な状態にするのは無理がある気はする、人間が変数の有効期限を認知できない
だよね
Avatar
omochimetaru 29-Aug-18 03:11 AM
あ、もしかしたら、
ifの中のスコープにhandleをかけば
Avatar
tarunon 29-Aug-18 03:11 AM
swiftのdoって無名funcよろしく振る舞えるのだけど、そういうのは無理そうだな
Avatar
omochimetaru 29-Aug-18 03:11 AM
そのifスコープの範囲で捕まえるのかな?
Avatar
tarunon 29-Aug-18 03:11 AM
スコープが明示的に切れてその上で出来るなら
かなり良さそうですね
そして #other-lang でないことに気が付く
Avatar
omochimetaru 29-Aug-18 03:12 AM
Goは空スコープ作れたっけな・・・
Avatar
koher 29-Aug-18 03:12 AM
handle とスコープについては、 Go の defer はスコープ関係なく関数単位だったはずだから、 handle はどうなんだろう?とさっきから思ってる。
そして #other-lang でないことに気が付く
最初は Swift に言及されてるよ、だったので😅 #other-lang 行きますか。
Avatar
taketo1024 29-Aug-18 11:46 AM
こういう感じのグラフを生成できるいい感じの Swift 製ライブラリってありますかしら? (edited)
Avatar
hiragram 11-Sep-18 10:13 AM
@tarunon privateな行なのにいじると問答無用でフルビルドが始まるみたいなのってどういう状況で起こるんだっけ
Avatar
tarunon 11-Sep-18 11:35 AM
AがBをimportしているとき、Bの型の構造が少しでも変わるとAはフルビルド
ABIまだだから残当な気もしている
😯 1
Avatar
hiragram 11-Sep-18 12:46 PM
それってobjc関係してるんだっけ
「型の構造」っていうのは外から見た可視性は関係ない?
Avatar
tarunon 11-Sep-18 12:47 PM
objcのブリッジングがコンパイル時間の重きを占める上に本体に存在してあらゆる場面で発火するから結構ストレス
経験則的に可視性関係なくメソッド変わったら発火する
internalなクラスを増やしたり、overrideちょっと変えたりしても大体アウト
Avatar
hiragram 11-Sep-18 12:48 PM
AがBをimportしているとき、Bの型の構造が少しでも変わるとAはフルビルド
これはどっちかがobjc含んでたらみたいな話なんだっけ?
Avatar
tarunon 11-Sep-18 12:50 PM
swiftだけでも起きるかもだけど、被害に遭うのはアプリ本体で、往々にしてそこにobjcブリッジングがある。
swiftだけで発生するかは確認していない
Avatar
hiragram 11-Sep-18 12:52 PM
モジュール分割を推し進めていくと食らう可能性があるよね
Avatar
tarunon 11-Sep-18 12:53 PM
いや、そもそも可視性関係なくswift書き換えたらobjcブリッジングが発火するのは本体アプリオンリーでも起きる
Avatar
hiragram 11-Sep-18 12:53 PM
importっていうのはそういうことか
モジュールの話かと思った
Avatar
tarunon 11-Sep-18 12:53 PM
頻度の問題で、 1. 開発速度が間違いなく向上する 2. Frameworkはswiftオンリーなのでobjc書かない と言う二つの事象でswiftを書く頻度が確実に上がる
これがビルドに対するストレスとして顕在化するんじゃ
Avatar
hiragram 11-Sep-18 12:55 PM
うーん
Avatar
tarunon 11-Sep-18 12:55 PM
後もう一個、 3. 全体で底上げされるのでマージ&フルビルドも増える
Avatar
norio_nomura 25-Sep-18 01:14 PM
#uikit で出てたStringからNSStringへの暗黙変換が起きる条件って何だろう?
例えばNSString.character(at:)は、Linuxでは4.2から起きる。 @swift-4.0.3 @swift-4.1.3 @swift-4.2.4 -frontend -repl
import Foundation "test".character(at: 0)
(edited)
Avatar
swift42 BOT 25-Sep-18 01:16 PM
// r0 : unichar = 116
(edited)
Avatar
swift40 BOT 25-Sep-18 01:16 PM
stderr:
<REPL Input>:1:1: error: value of type 'String' has no member 'character' "test".character(at: 0) ^~~~~~ ~~~~~~~~~ Swift.String:42:16: note: did you mean 'characters'? public var characters: String.CharacterView { get set } ^
(edited)
Avatar
swift41 BOT 25-Sep-18 01:16 PM
stderr:
<REPL Input>:1:1: error: value of type 'String' has no member 'character' "test".character(at: 0) ^~~~~~ ~~~~~~~~~ Swift.String:10:16: note: did you mean 'characters'? public var characters: String.CharacterView { get set } ^ Swift.String:8:16: note: did you mean '_characters'? public var _characters: String._CharacterView { get set } ^
(edited)
Avatar
norio_nomura 25-Sep-18 01:19 PM
macOSだと起きない。
$ echo 'import Foundation; "test".character(at: 0)'|swift -frontend -repl -sdk `xcrun --sdk macosx --show-sdk-path` <REPL Input>:1:20: error: value of type 'String' has no member 'character' import Foundation; "test".character(at: 0) ^~~~~~ ~~~~~~~~~ Swift.String:10:16: note: did you mean 'characters'? public var characters: String.CharacterView { get set } ^ Swift.String:8:16: note: did you mean '_characters'? public var _characters: String._CharacterView { get set } ^
Avatar
rintaro 25-Sep-18 01:42 PM
現状の master のソースを見る限り、1) 元のタイプが Swift.String であり、2) Swift.String_ObjectiveCBridgeable であり、 3) lookupするメンバー名が Swift.String に生えておらず、 4) ブリッジ先タイプにはそのメンバーが存在し 5) 存在するモジュールが Clang モジュールの Foundation 以外のとき。 っていう条件なので、 corelibs-foundation は 5 の条件をすり抜けて見えちゃっている感じっぽいですね。 (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
norio_nomura 25-Sep-18 10:58 PM
なるほど。Swift 4.2でNSStringにインスタンスメンバーを追加すると、Stringからも使えてしまうと。 @swift-4.0.3 @swift-4.1.3 @swift-4.2.4 -frontend -repl
import Foundation extension NSString { func hoge() -> String { return "hoge" } } "test".hoge()
Avatar
swift42 BOT 25-Sep-18 10:58 PM
// r0 : String = "hoge"
Avatar
swift41 BOT 25-Sep-18 10:58 PM
stderr:
<REPL Input>:1:1: error: value of type 'String' has no member 'hoge' "test".hoge() ^~~~~~ ~~~~
Avatar
swift40 BOT 25-Sep-18 10:58 PM
stderr:
<REPL Input>:1:1: error: value of type 'String' has no member 'hoge' "test".hoge() ^~~~~~ ~~~~
Avatar
hiragram 28-Sep-18 02:39 AM
https://swift.org/blog/swift-4-2-released/ でSupport for batch mode compilation resulting in faster build timesと言及されているものについて。 この件はWWDC 2018のセッションでも紹介がありました: https://developer.apple.com/videos/play/wwdc201...
「複数ファイル単位でコンパイル」って具体的にどういうことなんだろう
1コアごとに1ファイルずつ順番にコンパイルしてたのが、ってことだと思うんだけど、ピンとこないです
Avatar
omochimetaru 28-Sep-18 02:40 AM
コンパイラが複数のファイルを同時に受け付けて
コンパイルするか
一つのファイルを受けて一つのオブジェクトを吐くか
Avatar
hiragram 28-Sep-18 02:41 AM
一時期あった「ソースコードを全部1ファイルにまとめるとコンパイル速いじゃん」と同じような話なのかなと思ったんだけど
違う?
Avatar
omochimetaru 28-Sep-18 02:42 AM
1つのswiftコマンドの呼び出しに
いくつのソースファイルがコマンド引数として渡されているか
という話です
Avatar
hiragram 28-Sep-18 02:42 AM
あーピンときた
今までは1ファイルしか渡せなかったのが複数渡せるようになったってことか
Avatar
omochimetaru 28-Sep-18 02:43 AM
デバッグモードに関してはそう。
Avatar
hiragram 28-Sep-18 02:43 AM
ふむ
Avatar
omochimetaru 28-Sep-18 02:43 AM
リリースモードはもともと複数渡しだった。
Avatar
hiragram 28-Sep-18 02:43 AM
なるほどー
Avatar
omochimetaru 28-Sep-18 02:43 AM
リリースモードは複数渡しにすることで
whole module optimization
つまり、「モジュールの中にサブクラスが一個も無いから実質ファイナル」とか
そういう最適化ボーナスがついてたけど
そのためには全部のファイルを渡さないといけないから
開発中にそれをやると毎回のビルドが時間がかかってしまうから
デバッグモードでは1コマンド1ファイルにして
変更されたものだけビルドしてた
今回のアップデートで、 変更されたいくつかのファイルを1コマンドでビルド っていう新しい挙動が実現されたんじゃないかな?
Avatar
hiragram 28-Sep-18 02:45 AM
あー
インクリメンタルビルドと組み合わせて美味しさが増したって感じかあ
Avatar
omochimetaru 28-Sep-18 02:46 AM
良いとこ取りって感じだと思う
Avatar
hiragram 28-Sep-18 02:46 AM
いいね
「Xcode10にしたらビルドがめっちゃ速くなった」という事実だけ体感していてなんでやと思ってたけど納得した
Avatar
rintaro 28-Sep-18 02:54 AM
以前が1ビルド1ファイル渡しっていうのは ちょっと正確ではなくて、今までも全部のファイルを渡していました。 が、コンパイル対象は一つだけ。他のファイルはCにおけるヘッダファイル的に宣言のみが使われていました。当然それらの宣言のタイプチェックも必要なので、仮に3ファイルあるとすると、3回のコンパイルで、のべ9ファイル分のタイプチェックが走っていたので効率が悪かったのです。
Avatar
omochimetaru 28-Sep-18 02:54 AM
あれ?そのタイプチェクした結果は、.swiftmodule ファイルとしてキャッシュされないですか?
Avatar
rintaro 28-Sep-18 02:56 AM
インクリメンタルビルドにおいて、ファイル毎.swiftmodule は依存の解決には使われていなかったと思うのですが、記憶違いかも。 (edited)
Avatar
omochimetaru 28-Sep-18 02:58 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
前にこのへんを読んでいて、SwiftPMの挙動は確認したんだけど、
xcodebuildはよくしらべてない・・・
And some build systems (coughXcodecough) want to individually track persisted output files, instead of dumping them into a temporary directory. Trying to specify the outputs for every input file on the command line would be awkward and ridiculous, so instead we use an output file map.
(edited)
ここらへんで いくつかのビルドシステム(コホン Xcode コホン) のために
依存ツリーをダンプしたファイルを作ってうんたらかんたら
Avatar
rintaro 28-Sep-18 03:06 AM
ちょっと挙動確認してからまた書きますね。
Avatar
ikesyo 28-Sep-18 03:14 AM
盛り上がってる〜 Batch Modeの挙動・実装を正確に追うのはちょっと時間なかったので、ある程度ぼかして書いていました
Avatar
omochimetaru 28-Sep-18 03:15 AM
SwiftPMならまだなんとか調べられるんだけど、xcodebuildだとSDKとかいろいろ渡されすぎてて気が遠くなるw
Avatar
rintaro 28-Sep-18 03:30 AM
やっぱりインクリメンタルビルドでファイル毎 .swiftmodule は出力されるものではありますが、他ファイルのコンパイル時に参照されて使われる物ではないですね。A.swift,B.swift, C.swiftあったときにクリーンビルドだと
swift -frontend -c -primary-file A.swift B.swift C.swift swift -frontend -c A.swift -primary-file B.swift C.swift swift -frontend -c A.swift B.swift -primary-file C.swift
の 3 フロントエンド実行されて、frontend に -primary-file じゃないファイルの .swiftmodule があったらそれに読み替えるみたいな機能はないので。
Avatar
norio_nomura 28-Sep-18 03:31 AM
Xcode 10からデフォルトになったNew Build Systemは、SwiftPM同様にllbuildマニフェストを使います。 Xcodeはマニフェストを ${PROJECT_TEMP_ROOT}/XCBuildData/*-manifest.xcbuild に生成します。 それらをSwiftPMの.build/debug.yamlとかと比較すると違いを調べやすいかも? (edited)
Avatar
omochimetaru 28-Sep-18 03:38 AM
なるほど〜〜
Avatar
rintaro 28-Sep-18 03:45 AM
$ cat A.swift @available(*, introduced: 1) public func funcA() { print("funcA") } $ cat B.swift public func funcB() { print("funcB") funcA() } $ cat C.swift public func funcC() { print("funcC") } $ cat output.json { "A.swift": { "object": "Derived/A.o", "swiftmodule": "Derived/A~partial.swiftmodule", "swift-dependencies": "Derived/A.swiftdeps", }, "B.swift": { "object": "Derived/B.o", "swiftmodule": "Derived/B~partial.swiftmodule", "swift-dependencies": "Derived/B.swiftdeps", }, "C.swift": { "object": "Derived/C.o", "swiftmodule": "Derived/C~partial.swiftmodule", "swift-dependencies": "Derived/C.swiftdeps", }, "": { "swift-dependencies": "Derived/buildrecord.swiftdeps" } } $ mkdir -p Derived
な状態から、
$ xcrun swiftc -v -incremental -output-file-map output.json A.swift B.swift C.swift -module-name MyModule -emit-library -emit-module -o Derived/MyModule.dylib
でとりあえずクリーンビルドして、Derived ディレクトリの中身見たり、A.swift@available消して同コマンド実行して何が起こってるか確認したりすると面白いです。
(edited)
👀 1
で、 swiftc コマンドに -enable-batch-mode 追加してあげるとXcode10の挙動と同等に。 (edited)
Avatar
norio_nomura 01-Oct-18 03:31 AM
ソースコードに何も変更はなく、新しい機能を使っているわけでもないのに、メジャーバージョンを上げてまでSwift 4.2に変えたい理由って何だろう? https://github.com/antitypical/Result/pull/271
Bump swift version to 4.2 and also increment pod version.
Avatar
omochimetaru 01-Oct-18 03:36 AM
個人的には最新版でビルドしてない時点でライブラリは使いたくないです
技術的な理由というより開発者が放置してるんじゃないか?って思ってしまう
4.2にする必要はなくても、将来5.0になったときに互換性の問題が出るかもしれなくて
そういうときに備えて、常に最新に対応する姿勢が見えないと
後のバージョンの対応が迅速じゃないかもしれない、って心配になる。
まあ、Resultぐらいなら、最悪そのときは自分でフォークして直すのも簡単だし使いますけど。
あと、プロジェクトの中で、あるモジュールは4.1、あるモジュールは4.2でビルドしてからリンクします、 みたいなやつ、動くのかもしれないけど信用ならないから心配。
Avatar
Kishikawa Katsumi 01-Oct-18 03:39 AM
^ に限らず、大抵のSwift 4.2対応ってくるPRはこんな感じなんですけど、
個人的には最新版でビルドしてない時点でライブラリは使いたくないです
これは使うほうが4.2のツールチェーンでビルドすればいいだけなので、ライブラリ側で互換性を崩す必要はないと思います。
Avatar
norio_nomura 01-Oct-18 03:39 AM
Swift 4.2でCI通すだけで良いと思うのですよね。
Avatar
omochimetaru 01-Oct-18 03:40 AM
Swift 4.2でCI通すだけで良い
ああ、READMEのところとかに、 [swift 4.2] みたいなバッジがついてたりしたら、安心です
4.2で問題がないことを確認していることがわかるので。
実際に問題がないかどうかじゃなくて、問題がないことをチェックしているか、がきになる。
それがないと、自分の環境でビルドはできても、実行時にはなにか変なことが起きるかもしれないし。 Resultぐらいシンプルなソースだとそれも考えにくいですが。。。
Avatar
norio_nomura 01-Oct-18 03:48 AM
あと、プロジェクトの中で、あるモジュールは4.1、あるモジュールは4.2でビルドしてからリンクします、 みたいなやつ、動くのかもしれないけど信用ならないから心配。
むむ、これって何かトラブルの事例ってあるのですか?
Avatar
omochimetaru 01-Oct-18 03:49 AM
いや、見聞きした事例はないです
個人的に、本当にちゃんと動くのかな・・・って思っているだけ (edited)
Avatar
norio_nomura 01-Oct-18 03:49 AM
なるほど。
Avatar
omochimetaru 01-Oct-18 03:50 AM
単純に、最も安全確実でクリーンだと思われるのが、関連ソース何もかもが最新ビタビタで揃ってる事なので。
あ、昔で言えば、ライブラリがbitcode対応していないのに引きずられて、それをリンクするアプリもbitcode対応できない、とかありましたね。
bitcodeが初出のバージョン間ではそういうこともありました。
Avatar
Kishikawa Katsumi 01-Oct-18 03:53 AM
Swiftはちょっと特殊だから難しいですけど、 最も安全確実なのはそれなりに使われているコードなのでいまでいうとSwift 4.0か4.1だと思いますね。 (edited)
Avatar
omochimetaru 01-Oct-18 03:53 AM
なるほど。
たしかに、少し前のメジャーで全部揃えるのが一番安心か・・・。
Avatar
Kishikawa Katsumi 01-Oct-18 03:55 AM
で、ライブラリ提供側だと、常に最新というポリシーもありだし、 使用者が選べるというのもありで、私は後者の考えを持っています。
あと、できるだけ古いツールチェーンもサポートすべきと思っていて、それはそっちの方が良いはずという意図があります。自分のリポジトリは。
Avatar
norio_nomura 01-Oct-18 04:05 AM
あれ?Xcode 9.xって、SWIFT_VERSION = 4.2になっててもswiftcへは-swift-version 4って渡すのかな?
Avatar
ikesyo 01-Oct-18 04:10 AM
9.xだとSwift 4.2という言語バージョンは知らないと思うので、4.1の指定したときと同じで4を渡す気がします (edited)
ResultでXcode 10でのCIは別PRがあるので安心してほしい https://github.com/antitypical/Result/pull/269
👍 1
Avatar
norio_nomura 01-Oct-18 04:13 AM
project.pbxprojSWIFT_VERSION = 4.2になってても過去のXcodeでビルド出来るなら、SWIFT_VERSION = 4.2にしてしまっても良い様な気がしてきた。
それだとbreaking changeにもならないよね。
Avatar
norio_nomura 01-Oct-18 05:13 AM
project.pbxprojSWIFT_VERSION = 4.2になってても、Xcode 9.0.1, 9.1, 9.2, 9.3.1, 9.4.1はswiftc-swift-version 4を渡すのを確認した。
Avatar
norio_nomura 01-Oct-18 09:24 AM
XcodeプロジェクトでSWIFT_VERSION = 4.2にしてもbreaking changeにならないとしても、podspecのswift_versionはどうなんだろう?
ドキュメント読んでもよくわからないな… https://guides.cocoapods.org/syntax/podspec.html#swift_version (edited)
The Dependency Manager for iOS & Mac projects.
Avatar
Kishikawa Katsumi 01-Oct-18 09:43 AM
pod_specのswift_versionはあったらそのバージョンの固定、っていう動作だからむしろ書かないほうが良いと思うんですよね。 書いてなければビルド環境に応じて4.2になるけど4.1って書いてしまったら4.1になる、はず。
Avatar
ikesyo 01-Oct-18 10:15 AM
そうすると、4.2をそのままだとビルドできないライブラリがあった時に(4.2が出るまでそれが分かっていなかった時)、ユーザーがアプリターゲットを4.2にしたと同時にライブラリも4.2でビルドされようとして、突然ビルドが壊れだして、ライブラリのユーザーもメンテナーも疲弊するなーという印象です。せっかくターゲット毎に異なる言語バージョンが使えるので、できる限り安定的にビルドできる状態を保証しておきたいと個人的には思います。 (edited)
まあみんなbetaの時からCI回してどの言語バージョンでもビルドできるようにしておいて、podのswift_versionを固定しないでおくのが理想的ではあると思いますが、なかなかそのリソースがないですよね (edited)
Xcode 10だと、3, 4, 4.2の3モードがあるので、swift_versionを指定しない場合は理想的にはそのすべてをサポートしておく必要がありそう。
Carthageだとライブラリ側のターゲット定義で言語バージョンを決められるけど、CocoaPodsだとユーザーのアプリの言語バージョン指定に引きづられてしまう(swift_versionを指定していない限り)ので難しさが増す、ということですね。 (edited)
Avatar
ikesyo 01-Oct-18 10:36 AM
こうしたケースを回避しようとすると、ユーザーが各自でpost_installフックで特定のライブラリのSWIFT_VERSIONを変更しなくてはいけない。その問題を解決するためにspec.swift_versionが追加された、という認識です。
Avatar
Kishikawa Katsumi 01-Oct-18 10:40 AM
固定したほうが良い場合ももちろんあります。 ただ、ResultsとかUIKit
使ってなかったら4.0-4.2はだいたい互換性があるはずなんで、
そういうのはむしろ固定しない方が良いと思うんですよね。
Avatar
ikesyo 01-Oct-18 10:43 AM
Swift 4以上の言語機能を使っている場合はSwift 3はサポート不可なので、指定しないわけにはいかない気がしますが、どうでしょうか?Xcode 10でユーザーのアプリがSWIFT_VERSION=3だとPodのターゲットもSwift 3になってしまうと思うので。
Avatar
Kishikawa Katsumi 01-Oct-18 10:45 AM
3もサポートするならコード内で分岐ですね。 まあどこかで諦めることにはなりますよ。
Avatar
ikesyo 01-Oct-18 10:45 AM
ResultくらいならSwift 3サポートも頑張れなくはないと思います(リソースさえあれば……)
Avatar
Kishikawa Katsumi 01-Oct-18 10:46 AM
例えば良くある例でいうとflatMap => compactMapの書き換えとか5が出るまでやりたくない感じじゃないですか?
下のバージョンに向けてはエイリアス的なものを提供するっていうのもアリですけど。
Avatar
ikesyo 01-Oct-18 10:47 AM
そういうAPIの差は、僕も実際によくエイリアスで対応してますね。
Avatar
Kuniwak 04-Oct-18 05:02 PM
@tarunon さんに教えてもらったメモリリークテストのヘルパー実装してみました! https://github.com/Kuniwak/UIKitTestable/blob/e977532c81a97998a4c776b2d1b70c167eb73841/UIKitTests/UIKitTests/MemoryLeakDetector.swift レポートもそこそこ親切にできたので、いい感じになりそうです: https://github.com/Kuniwak/UIKitTestable/blob/master/UIKitTestableTests/UIKitTestableTestsTests/MemoryLeakDetectorTests.swift 次は、UIViewController に適用するパターンですね。UIViewController の viewDidDisappear あたりまでを実行してから、UIViewController を解放するイメージで考えてますが、検証のタイミングが若干難しそうな気配が…
Make project using UIKit testable. Contribute to Kuniwak/UIKitTestable development by creating an account on GitHub.
Make project using UIKit testable. Contribute to Kuniwak/UIKitTestable development by creating an account on GitHub.
Avatar
tarunon 04-Oct-18 05:03 PM
おっ見てみます👀
因みに何ですけど
lazy varが.storageかつOptionalに化けるとか、Optionalを探索するのにsomeが生えるとかで問題があったりするので
意外とやる事は多いw
Avatar
Kuniwak 04-Oct-18 05:04 PM
そのケースは考えてなかったw
Optional は Mirror#children で拾えそうな気がしてるのですが、そう簡単な感じではなかった感じですか?
Avatar
tarunon 04-Oct-18 05:06 PM
拾えるんですけど、パスを生成するときにMirrorを雑に参照してlabel使っちゃうと (edited)
雑なパスになってしまいますw
Avatar
Kuniwak 04-Oct-18 05:06 PM
あー、なるほど。理解しました
しかし Mirror 側から lazy かどうかを判定するすべはなさそうなので、some が生えちゃうのは仕方なさそうなイメージですね
Avatar
tarunon 04-Oct-18 05:07 PM
いや、判定できます
labelがfoo.storageみたいになるのでこれがlazyの本体 (edited)
Avatar
Kuniwak 04-Oct-18 05:07 PM
お、それは初めてみました。ちょっと試してみますね
(indirect.storage -> some -> value)
あー、なるほどw
Avatar
Kuniwak 05-Oct-18 02:45 AM
寝ながらデータ構造でひとつ直した方がいいところに気づいたので後で直します。循環参照の参照経路をだすだけより、リークしたオブジェクトの型や文字列表現、与えられたオブジェクトからの参照経路も併せて出した方がいい気がします
Avatar
tarunon 05-Oct-18 02:46 AM
参考までに弊社Internalのものの出力ですが
Avatar
Kuniwak 05-Oct-18 02:46 AM
お、見たいです!
Avatar
tarunon 05-Oct-18 02:48 AM
Found 2 object leaking children[0].viewModel: SomeViewModel children[0].textField: UITextField
こんな感じで出てきます
Avatar
Kuniwak 05-Oct-18 02:49 AM
おー、確かにこっちの方が直感的ですね。真似します
Reference.Path.Component を enum にすればいけるかな
このメモリリーク判定機能、単体で切り出した方が有益そうな気配するな… UIKit 依存のあるプロジェクトにいれるのはもったいない
Avatar
tarunon 05-Oct-18 02:55 AM
Mirrorの変更で死ぬ場合があって(ついこの間死んだ)、メンテするのキビシイので会社のossとして出すのは難しいなと思っていました。出したい気持ちもあるんですがw
単体の方が有益はそれはそうと思います
Avatar
Kuniwak 05-Oct-18 02:59 AM
Mirror は頻繁に死にますねw 私も頻繁に苦しめられてます https://github.com/Kuniwak/MirrorDiffKit/blob/master/Sources/TupleRepresentationDetector.swift
Graduation from messy XCTAssertEqual messages. Contribute to Kuniwak/MirrorDiffKit development by creating an account on GitHub.
Avatar
Kuniwak 05-Oct-18 10:53 AM
Summary: Found 2 leak objects Leaked objects: 0: Description: Node Type: Any Location: .linkedNodes[0] 1: Description: Node Type: Any Location: (root) Circular reference paths: 0: .linkedNodes[0].linkedNodes[0]
いい感じになってきました
Avatar
ainame 09-Oct-18 10:38 AM
iPhone5(c)などの32 bit CPUの端末の実機 でクラッシュするコードを発見したっぽいのですが既知のバグだったりしますか? Enumのassociated valueに沢山プロパティが生えたオブジェクトを渡して参照するとクラッシュするっぽい挙動です (Xcode9.4でも起きてたのですがdebugビルドでしか再現してなくて、Xcode10でreleaseビルドでも再現するようになり発覚しました...) https://gist.github.com/ainame/04b07621112484b1d6a8b2bb791fcf74
Crashed on iPhone5(c). GitHub Gist: instantly share code, notes, and snippets.
Avatar
tarunon 09-Oct-18 10:38 AM
完全にやばそう
Optional壊れた話ってもしかしてこれかな
Avatar
ainame 09-Oct-18 10:39 AM
EXC_BAD_ACCESSでメモリ周りが壊れているっぽい
Avatar
omochimetaru 09-Oct-18 10:40 AM
お〜
Avatar
d_date 09-Oct-18 11:39 AM
compactMapValuesの説明書つくった https://twitter.com/d_date/status/1049618894585921537
資料です。ありがとうございました! https://t.co/OTHQuJnFmn #potatotips
👍 3
Avatar
Kuniwak 13-Oct-18 09:44 AM
長さが一定より小さくならない配列の型をつくって遊んでたんですが、gyb 結構簡単で便利ですね https://gist.github.com/Kuniwak/5296bef20ae923bf0c96a70d7bd16c07
GitHub Gist: instantly share code, notes, and snippets.
そしてこの ArrayLongerThan1 とか ArrayLongerThan3 とか普通に便利でした
悲しいのは Sequence に適合できないことですね… ArrayLongerThanN の map や enumerated は長さが変わらないことがわかっているので、戻り値を ArrayLongerThanN にしたいんですが、こうすると Sequence の定義と衝突するんですよね
一応、Sequence として扱いたい用途のために ArrayLongerThanN.sequence があるのですが、まああんまりいけてない…
Avatar
koher 13-Oct-18 01:25 PM
@Kuniwak この前↓について話してたときって Kuniwak さんいましたっけ? https://forums.swift.org/t/implement-nonempty-collections/14246
https://github.com/pointfreeco/swift-nonempty — For when a collection is guaranteed to have at least one value.
Avatar
Kuniwak 13-Oct-18 01:25 PM
げ、すでにそんなものが
Avatar
koher 13-Oct-18 01:26 PM
swift evolution ではこれは Pitch レベルだと思います。 (edited)
リンク先のライブラリは SequenceCollection ?)を型パラメータにとるのがおもしろいですね。 https://github.com/pointfreeco/swift-nonempty (edited)
🎁 A compile-time guarantee that a collection contains a value. - pointfreeco/swift-nonempty
🎁 A compile-time guarantee that a collection contains a value. - pointfreeco/swift-nonempty
Avatar
Kuniwak 13-Oct-18 01:27 PM
🎁 A compile-time guarantee that a collection contains a value. - pointfreeco/swift-nonempty
おや、自分ができなかったことをやっている…
戻り値の型だけ違うメソッドって定義できないという認識だったんですが、どうして Sequence.map と戻り値だけが異なる map を定義できるだろう
Avatar
koher 13-Oct-18 01:29 PM
衝突はしますが、できるとは思います。多分オーバーロードになるのかと。
Avatar
Kuniwak 13-Oct-18 01:29 PM
あ、これできるんですか…
Avatar
Kishikawa Katsumi 13-Oct-18 01:29 PM
呼び出すときに区別する必要があるので使い勝手は良くないですがオーバーロードできます。
Avatar
Kuniwak 13-Oct-18 01:29 PM
てことは、自分のときの型エラーは init の誤判定な気がしてきました
あー、なんかわかりました。これ NonEmpty のネストでやられそう
Avatar
koher 13-Oct-18 01:30 PM
僕も Image<Element>: Sequence を作ってますが Image to Imagemap ができてるので。 Sequence 由来のと曖昧になりそうな気がするんですが、 Image to Image の方が優先されてますね。
protocol のデフォルト実装は優先順位が低いのかな??
Avatar
Kuniwak 13-Oct-18 01:31 PM
これ、NonEmpty の C 側に NonEmpty 入れると動きがやばくなりそうな予感が
Avatar
koher 13-Oct-18 01:32 PM
Sequencemap とかついてるのほんと微妙ですよねぇ。 makeIterator だけの純粋な Sequencemap とかを分離してほしい・・・。
Avatar
Kuniwak 13-Oct-18 01:33 PM
わかります
そしてついでに map の戻り値を [T] じゃなくて Self にしてほしい(過激派)
Avatar
koher 13-Oct-18 01:33 PM
これ、NonEmpty の C 側に NonEmpty 入れると動きがやばくなりそうな予感が
その場合は Collection として扱われるので Collectionmap が呼ばれるんじゃないですか?↓とかですよね?
public func map<T>(_ transform: (Element) throws -> T) rethrows -> NonEmpty<[T]> { return try NonEmpty<[T]>(transform(self.head), self.tail.map(transform)) }
Avatar
Kuniwak 13-Oct-18 01:33 PM
ですです
なので、2要素以上配列とかを扱うとき相当不便になるのではないかと
Avatar
koher 13-Oct-18 01:34 PM
そしてついでに map の戻り値を [T] じゃなくて Self にしてほしい(過激派)
これ [Element][T] に変換するんで Self じゃなくて、 higher-kinded type がないとできないんですよねぇ・・・。
Avatar
Kuniwak 13-Oct-18 01:34 PM
確かに…
Avatar
koher 13-Oct-18 01:36 PM
2要素以上配列とかを扱うとき相当不便になるのではないかと
ここがよくわかってないです・・・
Avatar
Kuniwak 13-Oct-18 01:37 PM
NonEmpty を使った2要素以上配列は下のようになるという予想をしていて、
NonEmpty<Element, NonEmpty<Element, C>>
あ、いや、なんとかなるのかな… ちょっと前に出くわしたエラーの原因に別の心当たりができました
Avatar
koher 13-Oct-18 01:40 PM
NonEmpty<Element, NonEmpty<Element, C>> は考えてませんでしたが(それぞれの struct を実装するイメージしてました)、多分うまくいきそうな気がします。その場合だけ init(Element, Element, C)extension で生やせると便利そうですね〜。
Avatar
Kuniwak 13-Oct-18 01:42 PM
まさに自分の実装は typealias ArrayLongerThan2<Element> = PrefixedArray<Element, PrefixedArray<Element, PrefixedArrayEnd<Element>>> となっていて、これで flatMap とかの実装が衝突して死んだみたいなエラーに出くわして、ウワァ、ダメなのかみたいに引き返したんです (edited)
他にもいくつか不可解なエラーに出くわしていて(typealias だと動かないが、typealias を展開したものを使うと動くみたいな)、いろいろと辛い感じではありました
あ、safeFirst 、なるほど。。。
これも衝突してましたが、こういう風に逃げたのか…
いや、定義できるんですね、これちょっと前にどこかのチャンネルで話題になってた気がする
Avatar
koher 13-Oct-18 02:24 PM
@swift-4.2.4
protocol NonEmptySequence: Sequence { var first: Element { get } } struct NonEmptyArray<Element>: NonEmptySequence { private var array: [Element] init(_ array: [Element]) { precondition(!array.isEmpty) self.array = array } var first: Element { return array[0] } func makeIterator() -> Array<Element>.Iterator { return array.makeIterator() } }
(edited)
Avatar
swift42 BOT 13-Oct-18 02:24 PM
no output (edited)
Avatar
koher 13-Oct-18 02:25 PM
@swift-4.1.3
protocol NonEmptySequence: Sequence { var first: Element { get } } struct NonEmptyArray<Element>: NonEmptySequence { private var array: [Element] init(_ array: [Element]) { precondition(!array.isEmpty) self.array = array } var first: Element { return array[0] } func makeIterator() -> Array<Element>.Iterator { return array.makeIterator() } }
(edited)
Avatar
swift41 BOT 13-Oct-18 02:25 PM
no output (edited)
Avatar
koher 13-Oct-18 02:29 PM
@swift-4.0.3
protocol NonEmptySequence: Sequence { var first: Element { get } } struct NonEmptyArray<Element>: NonEmptySequence { private var array: [Element] init(_ array: [Element]) { precondition(!array.isEmpty) self.array = array } var first: Element { return array[0] } func makeIterator() -> Array<Element>.Iterator { return array.makeIterator() } }
Avatar
swift40 BOT 13-Oct-18 02:29 PM
no output
Avatar
koher 13-Oct-18 02:30 PM
あれ? firstSequence じゃなくて Collection なのか。
Avatar
Kuniwak 13-Oct-18 02:35 PM
あ、そうですね。Sequence は makeIterator しか要求しないです
Avatar
koher 13-Oct-18 02:38 PM
extension でも生えてないんですね。 map とかは生えてるのに・・・。
@swift-4.1.3
protocol I { init() } protocol P { associatedtype A: I } extension P { var bar: A? { return nil } } protocol Q: P {} extension Q { var bar: A { return A() } } struct S<T: I>: Q { typealias A = T let value: T var bar: T { return value } } extension Int: I { init() { self = 0 } } let s = S(value: 42) print(s.bar)
(edited)
Avatar
swift41 BOT 13-Oct-18 02:40 PM
42
(edited)
Avatar
koher 13-Oct-18 02:42 PM
safeFirst って何ができなかったんですか? Optional を非 Optional で満たすことができなかったとかではなく??
これは 4.2 でもできない。 @swift-4.2.4
protocol P { associatedtype A var a: A? { get } } struct S<T>: P { typealias A = T let value: T var a: T { return value } } let s = S(value: 42) print(s.a)
Avatar
swift42 BOT 13-Oct-18 02:46 PM
exit status: 1 with stderr:
<stdin>:7:8: error: type 'S<T>' does not conform to protocol 'P' struct S<T>: P { ^ <stdin>:10:9: note: candidate has non-matching type 'T' var a: T { return value } ^ <stdin>:4:9: note: protocol requires property 'a' with type 'S<T>.A?'; do you want to add a stub? var a: A? { get } ^
Avatar
Kuniwak 14-Oct-18 01:10 PM
あれ、不思議ですね。なんであのコードでコンパイルが通るんだろう…
Avatar
Kuniwak 18-Oct-18 02:51 AM
taru non さんからアイデアを教えていただいた Memory Leak のやつ、それなりに形になってきました https://github.com/kuniwak/memoryleaktestkit
Contribute to Kuniwak/MemoryLeakTestKit development by creating an account on GitHub.
どうでもいいんですが、Hacker News でいう ShowHN みたいなチャンネルがあるとこういうの投げやすいですね…
Avatar
omochimetaru 18-Oct-18 02:53 AM
Hacker News でいう ShowHN
を知らないのでよくわからないですが、なんてチャンネル名があればいいですか?
チャンネル概要(チャンネル名の右に出る文字列)も、もしあったら指定してくれればつけます。
Avatar
Kuniwak 18-Oct-18 02:54 AM
ShowHN は、自分の作った成果物を Hacker News で投稿する場所なんですよね https://news.ycombinator.com/showhn.html
ただ、論点もあると思っています
Avatar
omochimetaru 18-Oct-18 02:55 AM
なるほど。じゃあそのままのコンテキストなら #show ですかね、でも知らない人に伝わりにくいかも?
Avatar
Kuniwak 18-Oct-18 02:55 AM
はい
例えば、成果物を適当なチャンネルに投げてもそんなうざくないなら、チャンネル作らなくても OK だと思いますね
Avatar
omochimetaru 18-Oct-18 02:56 AM
話題になるし普通にむしろ歓迎だと思います
Avatar
Kuniwak 18-Oct-18 02:57 AM
であれば、それ用のチャンネルはいらない気がしますね。例えば Metal 系のライブラリとかなら #metal とかに投げたほうがより良いと思いますし
Avatar
omochimetaru 18-Oct-18 02:57 AM
OKです
Avatar
Avatar
omochimetaru 18-Oct-18 02:57 AM
Kuniwakさんのリークテストは、detectLeaksで参照グラフをスキャンして、循環を見つける設計なんですね
Avatar
Kuniwak 18-Oct-18 02:58 AM
いえ、循環は純粋にデバッグのための付加情報です
Avatar
omochimetaru 18-Oct-18 02:58 AM
createSomething() の中でリークしていても見つけられるんです?
let target から到達できなかったらどうにもならない気が。
Avatar
Kuniwak 18-Oct-18 02:58 AM
その場合はちょっと変わった表示が出るはずです
なお、やり方としては、オブジェクトグラフをたどっていって、 それぞれを weak で写しとって、weak の中身がちゃんと回収されているかみるという感じですね
なので、回収自体は Swift の RC の仕組みに乗っかってます
Avatar
omochimetaru 18-Oct-18 03:00 AM
むむ (edited)
Avatar
Kuniwak 18-Oct-18 03:00 AM
循環参照が見つからない場合は 2 つの可能性が考えられるので、次のようなエラーメッセージが出ます: https://github.com/Kuniwak/MemoryLeakTestKit/blob/master/Sources/MemoryLeakTestKit/LeakedObject.swift#L47-L51
Contribute to Kuniwak/MemoryLeakTestKit development by creating an account on GitHub.
Contribute to Kuniwak/MemoryLeakTestKit development by creating an account on GitHub.
あ、テストケースのコメント間違ってる。。。
Avatar
omochimetaru 18-Oct-18 03:02 AM
リークするかどうか検査したい関数があるとして、
1. オブジェクトを全部スキャンする 2. 検査したい関数を実行する 3. スキャンしてあるweak参照の先に生きてるオブジェクトが無いことを確認する
(edited)
この3ステップが必要だと思うんですけど
let target = createSomething() let memoryLeaks = detectLeaks(target) XCTAssertTrue( memoryLeaks.leakedObjects.isEmpty, memoryLeaks.prettyDescription )
↑のUsageだと、createSomethingが「検査したい関数」で、detectLeaksがスキャンだとすると、 createSomethingの中で発生したリークが、わからないと思ったのですが、なにか僕が勘違いしてますか (edited)
Avatar
Kuniwak 18-Oct-18 03:04 AM
えと一点確認させて欲しいのですが、createSomething のなかで発生したリークは、具体的にどのような感じを意図されていますか
可能ならこういうオブジェクトグラフですみたいなのがあれば
Avatar
omochimetaru 18-Oct-18 03:05 AM
class Cat { var parent: Cat? } func createSomething() -> Cat { let cat1 = Cat() let cat2 = Cat() let cat3 = Cat() cat2.parent = cat3 cat3.parent = cat2 return cat1 }
Avatar
Kuniwak 18-Oct-18 03:05 AM
あるいは、RC での回収タイミングの話です?実はちょっとそこ自信のない(ただしテストは通ってしまった)場所ではあります
なるほど、そのケースはテストを見るかぎり捉えられています
Avatar
omochimetaru 18-Oct-18 03:07 AM
やってみます
Avatar
Kuniwak 18-Oct-18 03:08 AM
a,
これ README 間違ってますね
💀
え、しかもテストも妙な感じだ。。。
Summary: Found 0 leaked objects Leaked objects: (empty)
leak してない、、、だと?
あ、そりゃそうだ
cat1 から cat2 と cat3 を辿れないので、そもそも参照を得られてないからですね
Avatar
omochimetaru 18-Oct-18 03:12 AM
はい、そうなると思ってて。
Avatar
Kuniwak 18-Oct-18 03:12 AM
なので、この場合は cat2 と cat3 の leak は捉えられないです
戻り値のオブジェクトから辿れるものだけがわかる、みたいな感じでしょうか
Avatar
omochimetaru 18-Oct-18 03:16 AM
そうすると検出できるリークって、「targetから到達できて循環してる部分」になると思うんですが
なお、やり方としては、オブジェクトグラフをたどっていって、 それぞれを weak で写しとって、weak の中身がちゃんと回収されているかみるという感じですね なので、回収自体は Swift の RC の仕組みに乗っかってます
1. weakで写し取る 2. Swiftのしくみで回収された後で・・・ 3. 写し取ったweakがnilになっているか確かめる
Avatar
Kuniwak 18-Oct-18 03:18 AM
そうすると検出できるリークって、「targetから到達できて循環してる部分」になると思うんですが
あー、これは正確にもうちょっとだけ範囲が広いです。というのも、さっきの cat2 や cat3 から cat1 への参照があった場合、cat 1 からの参照に循環参照はありませんが、cat1 が回収されないので
これは検知できます
Avatar
omochimetaru 18-Oct-18 03:18 AM
あ、なるほど。
Avatar
Kuniwak 18-Oct-18 03:18 AM
ただ、概ねは omochi さんのご理解で正しいとは思います
Avatar
omochimetaru 18-Oct-18 03:19 AM
class Cat { var parent: Cat? var child: Cat? } func createSomething() -> Cat { let cat1 = Cat() let cat2 = Cat() let cat3 = Cat() cat2.parent = cat3 cat3.parent = cat2 cat2.child = cat1 return cat1 }
この場合ですね
あら
detectLeaksはオブジェクトを受け取ると思ってたけど () -> T を受け取るのか。
これ README 間違ってますね
そういうことか
クロージャで受けてるから、detectLeaksの内部で、 「weakで全部保持」 「検査したいユーザコードの実行」と「Swiftのスコープ解放の完了待ち」ができて 「weakで保持したもののチェック」 ができるのか。
Tを受け取ると思っていたので引っかかっていたけど納得しました
Avatar
Kuniwak 18-Oct-18 03:42 AM
そうなんですよ、すみませんでした。。。
Avatar
Kuniwak 18-Oct-18 03:54 AM
README 直しました 🙇
🙂 1
Avatar
noppe 20-Oct-18 05:17 AM
let json = """ [{ "id": 0, "mode": "high" },{ "id": 1, "mode": "middle" },{ "id": 2, "mode": "moddle" },{ "id": 3, "mode": "low" }] """ enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode } let objects = try! JSONDecoder().decode([Object].self, from: json.data(using: .utf8)!) print(objects)
↑のような時に、Jsonのデコードを失敗とせずid:0,1,3のObjectの配列を返すような実装がしたい場合Arrayのラッパーみたいなものを書く感じになるのでしょうか?
Avatar
Kuniwak 20-Oct-18 06:28 AM
Mode を optional にして compactMap で再構成するのはめんどいです?
Avatar
noppe 20-Oct-18 06:42 AM
enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode? } do { let decoder = JSONDecoder() let data = json.data(using: .utf8)! let objects = try decoder.decode([Object].self, from: data).compactMap({ $0.mode != nil }) print(objects) } catch { print(error) }
こういうことですか? どうもキーがあるとModeのDecodeで失敗するとthrowされてしまってそうです…
Avatar
norio_nomura 20-Oct-18 07:14 AM
@swift-4.2.4
import Foundation let json = """ [{ "id": 0, "mode": "high" },{ "id": 1, "mode": "middle" },{ "id": 2, "mode": "moddle" },{ "id": 3, "mode": "low" }] """ enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode? enum CodingKeys: CodingKey { case id, mode } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.id = try container.decode(Int.self, forKey: .id) self.mode = try? container.decode(Mode.self, forKey: .mode) } } let objects = try! JSONDecoder().decode([Object].self, from: json.data(using: .utf8)!).filter { $0.mode != nil } print(objects)
Avatar
swift42 BOT 20-Oct-18 07:14 AM
[main.Object(id: 0, mode: Optional(main.Mode.high)), main.Object(id: 1, mode: Optional(main.Mode.middle)), main.Object(id: 3, mode: Optional(main.Mode.low))]
Avatar
noppe 20-Oct-18 07:53 AM
ありがとうございます!いけました、CodingKeyでマニュアル操作しないといかんのですね 何かCompactDecodableやCompactJSONDecoderのようなアプローチで実装できたら使いやすいかなと思ったのですが良い方法が思い浮かばず
Avatar
omochimetaru 20-Oct-18 11:55 AM
@noppe @swift-4.2.4
import Foundation let json = """ [{ "id": 0, "mode": "high" }, { "id": 1, "mode": "middle" }, { "id": 2, "mode": "moddle" }, { "id": 3, "mode": "low" } ] """ enum Mode: String, Decodable { case high case middle case low } struct Object: Decodable { let id: Int let mode: Mode init(id: Int, mode: Mode) { self.id = id self.mode = mode } } struct FailableBox<T> : Decodable where T : Decodable { init(from decoder: Decoder) throws { self.value = try? T.init(from: decoder) } var value: T? } let objects: [Object] = try! JSONDecoder() .decode([FailableBox<Object>].self, from: json.data(using: .utf8)!) .compactMap { $0.value } print(objects)
Avatar
swift42 BOT 20-Oct-18 11:55 AM
[main.Object(id: 0, mode: main.Mode.high), main.Object(id: 1, mode: main.Mode.middle), main.Object(id: 3, mode: main.Mode.low)]
Avatar
omochimetaru 20-Oct-18 11:55 AM
@noppe こんなやりかたはどうでしょう
Avatar
noppe 20-Oct-18 12:14 PM
元のモデルのインターフェイス変わらないので良さそうです!
Avatar
omochimetaru 20-Oct-18 12:15 PM
もしJSONツリー全体でそのような制御をしたい場合は、JSONDecoderを自作しちゃうのが早いと思います。
Avatar
noppe 20-Oct-18 12:18 PM
そこ気になっていたのですが、JSONDecoder自作でこの辺りって制御できるのでしょうか?
Avatar
omochimetaru 20-Oct-18 12:21 PM
できると思うけどやってみないとはっきりといえないですね、確信度70%
Avatar
noppe 20-Oct-18 12:22 PM
ここ出来ると使い勝手良さそうなので作ってみますー!ありがとうございます!
Avatar
omochimetaru 20-Oct-18 12:22 PM
他にも、デフォルトのJSONEncoderだと、
Optionalがnoneになってるときはキーごと消えてしまうけど
キーは常に出力して null を与えるとかも
自作だとできるんじゃないかな
Avatar
noppe 20-Oct-18 01:17 PM
あー、肝心のJSONをデコードしている部分はInternalなんですね
Avatar
omochimetaru 20-Oct-18 01:21 PM
ですね。Codableが提供するのは一般的な構造へのマッピングAPIだけで
JSONとしてどうなるかっていうのはCodableと関係なくって
そっちはJSONEncoderのoutputFormatプロパティとか、そういう個別の設定機能で調整するしかない
Avatar
noppe 20-Oct-18 01:23 PM
なるほど、カスタマイズ性が許容されている箇所以外を弄ろうとするといきなりやること多くなってしまうんですね
Avatar
omochimetaru 20-Oct-18 01:23 PM
ですね
できることならそういうのは要件ごと踏み倒して対応しないのがコスパ良い
が、JSON使うシーンはだいたい外部システムの都合があったりするので・・・ (edited)
Avatar
noppe 20-Oct-18 01:27 PM
Codable側で個別に対応するのが良さそうですね CodingKeysとか諸々バチっとハマるJSONなら書くことがほぼ無くなる設計になっているから、イニシャライザ一つ書くのにも楽に出来無いかと思ってしまいがちですねこの辺は (edited)
Avatar
omochimetaru 20-Oct-18 01:30 PM
ですね、キーのsnakeCase化とか、微妙に小回りがきいたりもする。
Avatar
noppe 20-Oct-18 06:27 PM
@swift-4.2.4
import Foundation enum Result { case win case lose case none } var results: [Int : Result] = [:] results[0] = .win results[1] = .lose results[2] = .none if results[2] == nil { print("result.2 is nil") }
Avatar
swift42 BOT 20-Oct-18 06:27 PM
result.2 is nil
Avatar
noppe 20-Oct-18 06:28 PM
知らなかった
Avatar
hironytic 21-Oct-18 12:02 AM
Optionalのnoneだと思われてるわけですね、これは危険だ… 😱
Avatar
kateinoigakukun 21-Oct-18 12:04 AM
@swift-4.2.4
import Foundation enum Result { case win case lose case none } var results: [Int : Result] = [:] results[0] = .win results[1] = .lose results[2] = .some(.none) if results[2] == nil { print("result.2 is nil") }
Avatar
swift42 BOT 21-Oct-18 12:04 AM
no output
Avatar
kateinoigakukun 21-Oct-18 12:06 AM
Optional暗黙変換の悲劇だ
Avatar
koher 21-Oct-18 01:10 AM
一瞬意味わからなかったけど Dictionarysubscript-> Value? だからかぁ。
getset で、 getOptional だけど setOptional でなくしたいケース、ときどきある気がしてる。
Avatar
hironytic 21-Oct-18 01:12 AM
@swift-4.2.4
enum Result { case win case lose case none } func foo(_ resultOrNil: Result?) { print(resultOrNil as Any) } foo(.win) foo(.lose) foo(.none) foo(Result.none)
Avatar
swift42 BOT 21-Oct-18 01:12 AM
Optional(main.Result.win) Optional(main.Result.lose) nil Optional(main.Result.none)
Avatar
hironytic 21-Oct-18 01:13 AM
Dictionaryの例はインパクトがあるけど、それ以外でも普通に起こるので、enumのメンバに none は避けるようにした方が無難そうですね。 (edited)
Avatar
koher 21-Oct-18 01:18 AM
暗黙変換の歪みは色んなところに出てきますねぇ・・・
Avatar
Kishikawa Katsumi 21-Oct-18 01:41 AM
Dictionaryの例はたぶん削除が呼ばれてるんですよね。 削除はnilリテラルだけを対象にするのが良いと思うんですよね。
Avatar
koher 21-Oct-18 01:43 AM
削除は removeValue(forKey:) だけにして、 subscript set を非 Optional にしてほしいです・・・。
Avatar
Kishikawa Katsumi 21-Oct-18 01:43 AM
^ それがベスト。
そもそも削除って便利構文を用意しなければならないほどの頻度でやらないんですよね。
Avatar
koher 21-Oct-18 01:44 AM
ただ、たとえ今から set で非 Optional 化できるようになっても、互換性の問題で Dictionarysubscript set をなくすのってできないかもですね😂
僕は、 dict[key] = nil って便利構文なんじゃなくて、 subscript の仕様制約上 set を非 Optional にできなかったため仕方なくついてるものだと思ってました。 (edited)
Avatar
Kishikawa Katsumi 21-Oct-18 01:46 AM
なるほど。確かにget/setのペアで型がそろってないとダメですよね。
😭 1
互換性を考慮すると、現在nilリテラルの代入で削除以外が起こることはないはずだから、nilリテラルの代入以外のOptionalの代入をコンパイラか別のLinterが警告する というのが妥当か。
Avatar
koher 21-Oct-18 01:52 AM
printOptional 警告はあるから、 Dictionarysubscript set でもその線が妥当そうですね。
Avatar
Kishikawa Katsumi 21-Oct-18 01:53 AM
話外れちゃうけどString Interpolationの警告は良いけどprint()の警告は別にいらないですけどね。
Avatar
koher 21-Oct-18 01:54 AM
確かに不便なだけのことが多いですね。 String Interpolation の方は Optional(2018)年 問題回避に役立ちますけど。
String Interpolation も、僕は CustomStringConvertible 以外できなくしちゃってもいいと思うんですよね。
Avatar
Kishikawa Katsumi 21-Oct-18 01:56 AM
print()の話で思いついたけど、nilを受け取れるようにするしかないけど正常ケースとしてはあまり受け取りたくない/考えてない、というケースに警告を出せる @nilWarning 属性みたいなものをつけられるといいのか?
Avatar
koher 21-Oct-18 01:57 AM
そうですね。 Optional 暗黙変換問題はどこででも起こりうるので、そういうのがあると良いのかも?
Avatar
Kishikawa Katsumi 21-Oct-18 01:57 AM
コンパイラの範疇を超えてるかな、Linterでやれって感じもする。
Avatar
koher 21-Oct-18 01:58 AM
うーん、でも警告を出したいかは API によるから、 @discardableResult とかと同じで Attribute 付けるとかしないとできなくないですか?
Avatar
Kishikawa Katsumi 21-Oct-18 01:59 AM
あ、それはそうですね。
メソッドに何らかの表明する手段が必要。。。コンパイラでやってくれるといいですね。
nil以外にも「外部の入力そのまま渡してるよ」っていう警告を出したりとか言語やLinterによってあるから、そういう仕組みかな。 型以外の情報で狭める表明。
Avatar
norio_nomura 21-Oct-18 02:47 AM
@swift-4.2.4 -frontend -repl
enum Result { case win case lose case none } let result: Result? = .none
これは暗黙変換ではなく Optional<Result>.none を入れてるだけですよね。
Avatar
swift42 BOT 21-Oct-18 02:47 AM
// result : Result? = nil
Avatar
koher 21-Oct-18 02:49 AM
そっちは暗黙変換じゃないですが、 .some の方が暗黙変換で、それと並べると .none も同じように見えてしまうという問題かと思います。
👍 1
Avatar
hironytic 21-Oct-18 03:09 AM
@swift-4.2.4
import Foundation enum Computer { case win case mac } enum Result { case win case lose case none case some(Computer) } func foo(_ resultOrNil: Result?) { print(resultOrNil as Any) } foo(.win) foo(.lose) foo(.none) foo(.some(.win)) print("") foo(Result.some(.win))
Avatar
swift42 BOT 21-Oct-18 03:09 AM
Optional(main.Result.win) Optional(main.Result.lose) nil Optional(main.Result.win) Optional(main.Result.some(main.Computer.win))
Avatar
hironytic 21-Oct-18 03:09 AM
まあこんなことになるのは少なそうだけど 🙂
Avatar
hiragram 22-Oct-18 08:04 AM
caseに乗ってるassoc valueがNeverだったらswitchにそのcaseなくてもコンパイル通るの初めて知った
enum Hoge { case waiwai case mu(Never) } let hoge = Hoge.waiwai switch hoge { case .waiwai: print("わいわい") }
😮 2
Avatar
koher 22-Oct-18 08:26 AM
↓ですね。 Result<Foo, Never>switchcase .failure 書かなくても網羅的になるはず。 https://discordapp.com/channels/291054398077927425/291054454793306112/336463567039496192
Avatar
hiragram 22-Oct-18 08:26 AM
大昔に議論されてた。
Avatar
koher 22-Oct-18 08:27 AM
検索したら色々出てきて楽しいです。
Avatar
omochimetaru 25-Oct-18 03:03 AM
正規表現書いてるとRawString早く欲しくなるなあ
Avatar
Kishikawa Katsumi 25-Oct-18 04:21 AM
"([0-9a-fA-F]+)\\.\\.([0-9a-fA-F]+);([a-zA-Z]+)" そうですねえ。
Avatar
koher 30-Oct-18 01:57 AM
@ikesyo ↓の swiftenv の 4.2 サポート版がリリースされないままなのって何か理由があるんですか? https://github.com/kylef/swiftenv/commit/a949ff6ab8d1386f1bc99219da1ba860ea7de35a
👌🏼 1
Avatar
ikesyo 02-Nov-18 12:27 AM
反応遅れました💦 特に理由はない気がします。kylefがやる気になったらリリースなのかも。
🙏 1
これがなくてもswiftenv-api経由で4.2の情報は取られてダウンロードはできるはずではありますね
Avatar
koher 08-Nov-18 09:00 AM
↓のようなパターンで、 ielement の片方を let 、片方を var にする方法ってありますか?
let array = [2, 3, 5] for var (i, element) in array.enumerated() { print("\(i): \(element)") }
普通にできた。
Avatar
omochimetaru 08-Nov-18 09:01 AM
え、できました?
Avatar
koher 08-Nov-18 09:02 AM
@swift-4.2.4
let array = [2, 3, 5] for (i, var element) in array.enumerated() { element += 1 print("\(i): \(element)") }
Avatar
swift42 BOT 08-Nov-18 09:02 AM
0: 3 1: 4 2: 6
Avatar
omochimetaru 08-Nov-18 09:02 AM
@swift-4.2.4
let array = [2, 3, 5] for (i, var element) in array.enumerated() { i += 1 element += 1 print("\(i): \(element)") }
Avatar
swift42 BOT 08-Nov-18 09:02 AM
exit status: 1 with stderr:
<stdin>:4:6: error: left side of mutating operator isn't mutable: 'i' is a 'let' constant i += 1 ~ ^
Avatar
omochimetaru 08-Nov-18 09:02 AM
ほんとだ。
Avatar
koher 08-Nov-18 09:03 AM
これって、普通の変数/定数宣言ではできない?
Avatar
omochimetaru 08-Nov-18 09:03 AM
なんか似たようなことをやろうとしてできなかったことがあった気がしたけどなんだろう・・・
Avatar
koher 08-Nov-18 09:03 AM
あと、 Optional Binding とか。
Avatar
omochimetaru 08-Nov-18 09:03 AM
if var hoge = hogeOpt はいけます
Avatar
koher 08-Nov-18 09:03 AM
それはできるけど、
タプルの片方だけ var
Avatar
omochimetaru 08-Nov-18 09:04 AM
そうそう。タプルになっちゃうから無理という気がしてた。
Avatar
koher 08-Nov-18 09:05 AM
↓これしたい。
(let a, var b) = (2, 3)
Avatar
omochimetaru 08-Nov-18 09:05 AM
そうだ、それだ
Avatar
t.ae 08-Nov-18 09:05 AM
var (x, y) = (0, 0) y = 190 print(x, y)
この形だとx is never mutatedの警告すら出ないですね
Avatar
koher 08-Nov-18 09:05 AM
え?そうだっけ? > @t.ae
それなら諦めて var にするのがいいのかな。
Avatar
t.ae 08-Nov-18 09:06 AM
僕の手元では少なくとも出てないですね
Avatar
rintaro 08-Nov-18 09:08 AM
let x: Int var y: Int (x, y) = (0, 0)
一応これは可能です。
あと、statement condition であれば、
let point: (Int, Int)? = nil if case (let x, var y)? = point { print(x, y) }
Avatar
koher 08-Nov-18 09:27 AM
@rintaro なるほどー!ありがとうございます!
Avatar
koher 09-Nov-18 03:48 AM
static subscript って作れないのか。 @swift-4.2.4
struct S { static subscript(i: Int) -> Int { return i + 1 } }
Avatar
swift42 BOT 09-Nov-18 03:48 AM
exit status: 1 with stderr:
<stdin>:3:12: error: subscript cannot be marked 'static' static subscript(i: Int) -> Int { return i + 1 } ~~~~~~~^
Avatar
omochimetaru 09-Nov-18 03:49 AM
へえ〜
Avatar
omochimetaru 13-Nov-18 01:42 AM
Replace this paragraph with a description of your changes and rationale. Provide links to external references/discussions if appropriate. Resolves SR-NNNN.
クラスメタデータが動的に初期化されるようになるかも。 Windows対応関係でこの手のメタデータのリンクについてずっとトラブってたみたいなんだけど、 その辺の対応?の中で、Windowsをそうしてその次は他でもそうするってslavaが書いている。 定数として定義が吐き出されないケースが増えるとLLVM-IRが読みにくくなりそう? (edited)
Avatar
kateinoigakukun 13-Nov-18 02:12 AM
VWTを埋めるだけならほとんどの部分は静的なテンプレートで済みそう
あー、でもVWTに依存してる奴があるのか…
Avatar
omochimetaru 13-Nov-18 02:13 AM
同期して初期化する関数にラップされるだけで、テーブルの中身自体は定数に出てるみたいな感じならまあ。
Avatar
kateinoigakukun 13-Nov-18 02:16 AM
type metadata自体のオフセットがすでにfull type metadataからズレてるのに、さらにテンプレートでズレると読むのがしんどそう
Avatar
hiragram 16-Nov-18 11:37 AM
こんばんは〜
class Container<Content> { init(a: Content) { // イニシャライザA fatalError() } init<T>(b: T) where T == Content { // イニシャライザB self.init(a: b as! Int) } }
(edited)
@swift-4.2.4
class Container<Content> { init(a: Content) { fatalError() } init<T>(b: T) where T == Content { self.init(a: b as! Int) } }
Avatar
swift42 BOT 16-Nov-18 11:37 AM
exit status: 11 with stderr:
<stdin>:7:27: error: same-type requirement makes generic parameters 'T' and 'Content' equivalent init<T>(b: T) where T == Content { ^ #0 0x000000000410ac94 PrintStackTraceSignalHandler(void*) (/usr/bin/swift+0x410ac94) #1 0x0000000004108b22 llvm::sys::RunSignalHandlers() (/usr/bin/swift+0x4108b22) #2 0x000000000410ae42 SignalHandler(int) (/usr/bin/swift+0x410ae42) #3 0x00007fdc32623390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390) #4 0x00000000016b1b09 swift::FunctionType::get(swift::Type, swift::Type, swift::AnyFunctionType::ExtInfo const&) (/usr/bin/swift+0x16b1b09) #5 0x00000000017fde74 swift::GenericFunctionType::substGenericArgs(swift::SubstitutionMap const&) (/usr/bin/swift+0x17fde74) #6 0x00000000017fdd02 swift::GenericFunctionType::substGenericArgs(llvm::ArrayRef<swift::Substitution>) (/usr/bin/swift+0x17fdd02) #7 0x000000000147abe0 swift::UncurriedCandidate::UncurriedCandidate(swift::ValueDecl*, unsigned int) (/usr/bin/swift+0x147abe0) #8 0x000000000147f346 swift::CalleeCandidateInfo::CalleeCandidateInfo(swift::Type, llvm::ArrayRef<swift::constraints::OverloadChoice>, bool, swift::constraints::ConstraintSystem&, bool) (/usr/bin/swift+0x147f346) #9 0x0000000001466f19 (anonymous namespace)::FailureDiagnosis::visitApplyExpr(swift::ApplyExpr*) (/usr/bin/swift+0x1466f19) #10 0x000000000144d4d6 swift::ASTVisitor<(anonymous namespace)::FailureDiagnosis, bool, void, void, void, void, void>::visit(swift::Expr*) (/usr/bin/swift+0x144d4d6) #11 0x0000000001446642 swift::constraints::ConstraintSystem::diagnoseFailureForExpr(swift::Expr*) (/usr/bin/swift+0x1446642) #12 0x000000000144cb76 swift::constraints::ConstraintSystem::salvage(llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::Expr*) (/usr/bin/swift+0x144cb76) #13 0x0000000001352138 swift::TypeChecker::solveForExpression(swift::Expr*&, swift::DeclContext*, swift::Type, swift::FreeTypeVariableBinding, swift::ExprTypeCheckListen
Avatar
hiragram 16-Nov-18 11:37 AM
なんか where T == Content はダメだよって正しいエラーを吐いたあとにセグフォで死ぬのを見つけた
Avatar
tarunon 16-Nov-18 11:38 AM
b as! Intは変なのでは
Avatar
hiragram 16-Nov-18 11:38 AM
それは変。
エラーはちゃんと処理してコンソールに吐いたあとに死ぬのってフェーズ的にはなにで死んでるんでしょうね
イニシャライザBの中でイニシャライザAを呼び出してる時点でselfの型はContainer<T>に決まっているのでその時点で T しか受けないことが決まっているイニシャライザAに T ではない Int を渡せちゃってる?
Stack dump: 0. Program arguments: /Applications/Xcode_10_1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret Development/MyPlayground.playground/Contents.swift -enable-objc-interop -sdk /Applications/Xcode_10_1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -color-diagnostics -module-name Contents 1. While type-checking 'init(b:)' at Development/MyPlayground.playground/Contents.swift:6:5 2. While type-checking statement at [Development/MyPlayground.playground/Contents.swift:6:38 - line:8:5] RangeText="{ self.init(a: b as! Int) }" 3. While type-checking expression at [Development/MyPlayground.playground/Contents.swift:7:9 - line:7:31] RangeText="self.init(a: b as! Int)" fish: 'swift Development/MyPlayground.…' terminated by signal SIGSEGV (Address boundary error)
久々にセグフォ引いてテンション上がってしまったよ
Avatar
kateinoigakukun 16-Nov-18 12:04 PM
@swift-nightly
class Container<Content> { init(a: Content) { fatalError() } init<T>(b: T) where T == Content { self.init(a: b as! Int) } }
Avatar
swiftNightly BOT 16-Nov-18 12:04 PM
exit status: 1 with stderr:
<stdin>:7:27: error: same-type requirement makes generic parameters 'T' and 'Content' equivalent init<T>(b: T) where T == Content { ^ <stdin>:8:14: error: cannot invoke 'Container<Content>.init' with an argument list of type '(a: Int)' self.init(a: b as! Int) ^ <stdin>:8:14: note: expected an argument list of type '(a: Content)' self.init(a: b as! Int) ^ <stdin>:7:5: error: designated initializer for 'Container<Content>' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer? init<T>(b: T) where T == Content { ^ convenience <stdin>:8:14: note: delegation occurs here self.init(a: b as! Int) ^
Avatar
kateinoigakukun 16-Nov-18 12:06 PM
正しそう
Avatar
hiragram 16-Nov-18 12:11 PM
おっ
なおってんのか
Avatar
noppe 22-Nov-18 05:17 AM
for i in 1... { print(i) }
これ無限ループになるんですね、終端値無くてもrangeになるんだ
Avatar
omochimetaru 22-Nov-18 05:18 AM
無限なんですか?
2^63-1がでかすぎて、実質無限なだけかも?
Avatar
noppe 22-Nov-18 05:18 AM
無限かどうか検証出来てないので実質無限かも
Avatar
omochimetaru 22-Nov-18 05:18 AM
あ、違うのか、終端が無いのだから、最大値が定義されていなくて、本当に無限なのかな?
ちなみにその記法自体は結構便利で
func eatBuffer() { self.buffer = Array(self.buffer[self.pos...]) self.pos = 0 }
↑ストリーム処理を書いているときにこれをよくやります
👏 1
Avatar
noppe 22-Nov-18 05:21 AM
確かにbytesのlength確認せずに読めるの便利ですね
Avatar
omochimetaru 22-Nov-18 05:21 AM
です
Avatar
masakihori 22-Nov-18 05:59 AM
enumerated()ではないindexが欲しい時にも
zip(0..., arraySlice)
Avatar
Avatar
norio_nomura 24-Nov-18 09:14 AM
SwiftLintのルールをSwiftSyntaxを使って実装し直してみたというお話。 https://twitter.com/simjp/status/1065772315189727233 現状のSourceKitを使った場合と同等の速度が出る様になるまでどれくらいかかるかな。 (edited)
tl;dr; Implementing SwiftLint using SwiftSyntax instead of SourceKitten would make it run over 20x slower 😭
Avatar
omochimetaru 24-Nov-18 03:13 PM
20倍・・・
Avatar
norio_nomura 25-Nov-18 12:22 AM
もう少しマシになったらしい。 https://github.com/realm/SwiftLint/pull/2480
This is a follow-up to #2476 but using SourceKitten's syntaxTree request instead of invoking the swiftc process for each file. Early results are promising but it's still significantly slowe...
あ、これはswiftcの代わりにSourceKitを使うSwiftSyntaxだ。
swiftc -> JSON -> SwiftSyntax -> SwiftLintFramework が SourceKit -> JSON -> SwiftSyntax -> SwiftLintFramework になってる。 (edited)
SourceKitネイティブのデータ構造を使う、現状の SourceKit -> SwiftLintFramework の方が速いのは当たり前だな。 (edited)
あいや、ネイティブとは違うか。
Avatar
norio_nomura 25-Nov-18 01:18 AM
SourceKitとSwiftSyntaxとの間がByteTreeになれば、今SwiftLintが使ってる[String: Any]ベースよりも速くなる可能性があるな。 https://github.com/apple/swift-syntax/blob/master/Sources/SwiftSyntax/ByteTreeDeserialization.swift
SwiftPM package for SwiftSyntax library. Contribute to apple/swift-syntax development by creating an account on GitHub.
Avatar
norio_nomura 19-Dec-18 09:51 AM
Package.resolvedをコミットしていないリポジトリにいつの間にかPackage.resolvedが生成されたり、知らないうちにPackage.resolvedが更新されたりしてたりしたのが不思議だったのだけど、SourceKit-LSPを入れたVSCodeでワーキングコピーを開いてたからだった。
Avatar
omochimetaru 19-Dec-18 09:53 AM
VSCodeがpackage updateするんですか?
Avatar
norio_nomura 19-Dec-18 09:54 AM
SourceKit-LSPがビルドするんじゃないかな。
Avatar
omochimetaru 19-Dec-18 09:55 AM
ああ、なるほど。
普通のSourceKitやXcodeはSwiftPMと一切反応しないから、
SourceKit-LSPはちょっと違う設計思想になってそう
Avatar
norio_nomura 19-Dec-18 10:25 AM
Package.swiftの中身がLinux向けとmacOS向けで依存するライブラリが違ってて、リポジトリにはLinux向けに生成されたPackage.resolvedがコミットされてて、それをmacOSのVSCodeで開くとPackage.resolvedが更新される。
Avatar
omochimetaru 19-Dec-18 10:26 AM
それは地味に面倒ですねw
Avatar
norio_nomura 19-Dec-18 10:29 AM
Swiftボットに使ってるSwordっていうライブラリがそんなヘンテコな構成になってる。
脱Swordしたい。
Avatar
norio_nomura 26-Dec-18 02:54 AM
いつからか分からないけど、swift-5.0-DEVELOPMENT-SNAPSHOT-…のmacOS版でStringのUTF16関連がぶっ壊れてるぽい。 (edited)
Avatar
norio_nomura 26-Dec-18 03:35 AM
違った。Data.withUnsafeBytes(_:)がクロージャへコピーされた一時メモリを指すポインタを渡すように変わったからだった。
Avatar
norio_nomura 26-Dec-18 12:09 PM
@swift-4.2.4
import Foundation let data = "test".data(using: .utf8)! dump(data) data.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> Void in dump(bytes) }
(edited)
Avatar
swift42 BOT 26-Dec-18 12:10 PM
▿ 4 bytes - count: 4 ▿ pointer: 0x00000000079af0d0 - pointerValue: 127594704 ▿ bytes: 4 elements - 116 - 101 - 115 - 116 ▿ 0x00000000079af0d0 - pointerValue: 127594704
(edited)
Avatar
norio_nomura 26-Dec-18 12:11 PM
macOSだとpointerValueが違う。
$ xcrun --toolchain org.swift.5020181225a swift swift_oss_helper command enabled. Welcome to Apple Swift version 5.0-dev (LLVM c351ac7354, Clang aadec4ff83, Swift 5cfc2e7ba9). Type :help for assistance. 1> import Foundation 2. let data = "test".data(using: .utf8)! 3. dump(data) 4. data.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) in 5. dump(bytes) 6. } ▿ 4 bytes - count: 4 ▿ pointer: 0x00007ffeefbff818 - pointerValue: 140732920756248 ▿ bytes: 4 elements - 116 - 101 - 115 - 116 ▿ 0x00007ffeefbffb30 - pointerValue: 140732920757040
(edited)
Avatar
norio_nomura 13-Jan-19 06:30 AM
SwiftのCodableは便利ですが、FoundationJSONEncoder, JSONDecoderを使っていて微妙に不便に感じる事があります。自分がいろいろな案件をこなしたり、他人の困り事を聞いてきた上で、...
Avatar
omochimetaru 13-Jan-19 06:30 AM
お。ありがとうございます
Avatar
norio_nomura 13-Jan-19 06:31 AM
けど、LinkedListObject周りリークしまくりでは。
Avatar
omochimetaru 13-Jan-19 06:35 AM
あ、たしかに。nextとprev両方ともstrongじゃダメだ。
Avatar
omochimetaru 13-Jan-19 07:46 AM
XCTestにLeaksをかけてみたんですが
Leaksがサイクル検出をする前にプロセスが終了しちゃうみたいで
良い方法ってありますか?
Avatar
Avatar
norio_nomura 13-Jan-19 12:22 PM
LinkedListObject.IndexLinkedListObject.Node?にしたらシンプルになるのでは?と試してたのだけど、public typealias Index = Optional<Node>を定義してもCollectionにconform出来ていないと文句を言ってくる。
Collection.IndexにはOptionalを使えないのかな。
Avatar
norio_nomura 13-Jan-19 12:58 PM
extension Optional: Comparable where Wrapped: Comparableになってなかった。
Avatar
omochimetaru 14-Jan-19 12:13 AM
そのcomparableが厄介なんですよね
Collectionに準拠するために実装してあるけど、func <がO(n)になっちゃってる
O(1)にしろとは書いてなかったから、セーフだと思うけど、気持ち悪い
たしかにNode?がcondconfしてればIndex型を無くせますね
Avatar
tarunon 14-Jan-19 12:15 AM
その場合nilが末尾なのであらゆるものより大きくなるのかしら
Avatar
omochimetaru 14-Jan-19 12:16 AM
そう
いまのIndexもプロパティでNode?を持ってて、まさにそうなってるよ
Avatar
tarunon 14-Jan-19 12:16 AM
ウウーンそのルールをConditionalConformに追加するのは
今のswiftだとキツそう
キツいというのは、出来るけど汚染が
Avatar
omochimetaru 14-Jan-19 12:17 AM
やるならWrapped==Nodeのピンポイントcondじゃない?
できないんだっけ?
Avatar
tarunon 14-Jan-19 12:17 AM
出来るけど、OptionalのComparableが他で拡張できなくなる
Avatar
omochimetaru 14-Jan-19 12:18 AM
あーー
Avatar
tarunon 14-Jan-19 12:18 AM
かと言ってWrappedがComparableの時にnilをmax扱いは
Avatar
omochimetaru 14-Jan-19 12:18 AM
Optional:Comparableが占有されちゃうんか。
Avatar
tarunon 14-Jan-19 12:18 AM
ちょっと乱暴の気がするよね
Avatar
omochimetaru 14-Jan-19 12:18 AM
そうしたく無い人もいそうだね。
Avatar
tarunon 14-Jan-19 12:18 AM
素直にIndex作るのが良いだと思いました
急がば回れ
Avatar
omochimetaru 14-Jan-19 12:19 AM
condconfが進化したら
その時に削除できるね
Avatar
tarunon 14-Jan-19 12:21 AM
そういえばcondconf汚染した2つのframeworkをimportしたらどうなるんやろ
コンパイルエラーかな
Avatar
omochimetaru 14-Jan-19 12:22 AM
たしかに
Avatar
norio_nomura 14-Jan-19 12:23 AM
NodeSequenceにすると、func <が少し簡単になる。
Avatar
omochimetaru 14-Jan-19 12:23 AM
あー、イテレーションしてるところですか?
Avatar
norio_nomura 14-Jan-19 12:23 AM
nextfollowingに変えてる。
public static func < (lhs: LinkedListObject.Node, rhs: LinkedListObject.Node) -> Bool { if lhs == rhs || lhs.previous == rhs { return false } for following in lhs where following == rhs { return true } return false }
Avatar
omochimetaru 14-Jan-19 12:25 AM
おお素晴らしい
そこ境界がゴチャゴチャして何回かバグったのです
ていうかforってwhereつけれたんだ。
Avatar
norio_nomura 14-Jan-19 12:27 AM
僕もpublic typealias Index = Node?案はやはり却下という結論に至った。
Avatar
omochimetaru 14-Jan-19 12:27 AM
冒頭のpreviousは、隣接してるときは常にo(1)にしたいから?
Avatar
norio_nomura 14-Jan-19 12:27 AM
そう。
Avatar
omochimetaru 14-Jan-19 12:27 AM
なるほど。
Avatar
norio_nomura 14-Jan-19 12:28 AM
func copyoldIndicesに書き戻してるところは、何に使うつもりで書かれてたのですか?
Avatar
omochimetaru 14-Jan-19 12:28 AM
removeとかで使ってますよ
structの方で。
copyonwriteによるLinkedListObjectのクローンがおきたとき (edited)
Indexはクローン前のリストのノードになってるので
クローン先のノードに向けてやらないと続きの処理ができないんです
Avatar
norio_nomura 14-Jan-19 12:32 AM
ふむ。
なるほど、ようやく分かりました。
Avatar
omochimetaru 14-Jan-19 12:36 AM
最初その問題に気がついて萎えて値型はやめたんですが、やっぱり値型で使いたかったので、苦渋の設計でそうなってますw
Avatar
norio_nomura 14-Jan-19 02:02 AM
NodeCollectionに。
extension LinkedListObject.Node: Collection { public enum Index: Comparable { case node(LinkedListObject.Node), none public static func < (lhs: Index, rhs: Index) -> Bool { switch (lhs, rhs) { case (.node(let lhs), .node(let rhs)): return lhs < rhs case (.node(_), .none): return true default: return false } } init(_ node: LinkedListObject.Node?) { self = node.map(Index.node) ?? .none } var node: LinkedListObject.Node? { guard case .node(let node) = self else { return nil } return node } } public var startIndex: Index { return .node(self) } public var endIndex: Index { return .none } public subscript(position: Index) -> LinkedListObject.Node { guard let node = position.node else { preconditionFailure("Index out of range") } return node } public func index(after i: Index) -> Index { guard let node = i.node, let nextIndex = node.next.map(Index.node) else { return .none } return nextIndex } }
そしてLinkedListObject.Node.IndexLinkedListObject.Indexに。
Avatar
omochimetaru 14-Jan-19 02:13 AM
なるほど・・・?自身からendまでのコレクションとしてNodeだけで振る舞える?
Bidirectinalは自身で止まっちゃうからダメかな?
Avatar
norio_nomura 14-Jan-19 02:15 AM
BidirectionalCollectionLinkedListObjectで対応ですね。
extension LinkedListObject : BidirectionalCollection { public func index(before i: Index) -> Index { checkValidIndex(i) if i == endIndex { return Index(last) } precondition(i != startIndex, "Can't advance before startIndex") return Index(i.node?.previous) } }
Avatar
omochimetaru 14-Jan-19 02:17 AM
ふむふむ Node.Index.<はNode.<に転送されてるんですかね
Avatar
norio_nomura 14-Jan-19 02:26 AM
ですね。
Avatar
omochimetaru 14-Jan-19 02:30 AM
NodeがCollectionになれるアイデアは面白いけど、実装が分断して複雑になってる感じがして好みでは無いなあ
Avatar
norio_nomura 14-Jan-19 02:40 AM
そうね。NodeCollectionになれるだけで、Collectionであるメリットは全く無い。Sequenceで十分。
Avatar
norio_nomura 14-Jan-19 04:02 AM
copy周りはRangeReplaceableCollectionreplaceSubrange()みたいに、操作に必要なデータも渡してしまう方が良い気がする。
Avatar
omochimetaru 14-Jan-19 04:05 AM
copyと同時にミューテートもするってことですか?
Avatar
norio_nomura 14-Jan-19 04:12 AM
そう。
Avatar
omochimetaru 14-Jan-19 04:13 AM
そこは値型ラッパーの実装パターンを、copy on writeの教科書的な形にしておきたかったのと、それで特に計算量が変わらないからこうしていますね
Avatar
norio_nomura 14-Jan-19 04:35 AM
なるほど。
Avatar
omochimetaru 18-Jan-19 07:09 AM
XCTestCaseでテストメソッドからSwiftの例外を投げると、
XCTestのランタイム側でSwiftのエラーがNSErrorに変換されて?から、コンソールにprintされるらしくて
たとえもとのエラーがCustomStringConvertibleだったとしても、それが表示されないんですけど
みなさんどうしてます?
Avatar
norio_nomura 18-Jan-19 07:37 AM
エラーの内容を見たいときはテストメソッド内でcatchしてる。
Avatar
omochimetaru 18-Jan-19 07:38 AM
一時的にdoで包む形に書き換えるってことですか?
Avatar
norio_nomura 18-Jan-19 07:40 AM
うん。XcodeのGUIで実行できるならSwift Errorブレークポイントも使う。
Avatar
omochimetaru 18-Jan-19 07:49 AM
やはりそれしか無いかあ
Avatar
norio_nomura 18-Jan-19 07:54 AM
lldbで特定のレジスタをSwiftのインスタンスとして扱う方法とかあるのかな?
Avatar
omochimetaru 21-Jan-19 02:18 AM
Hi everyone, This is my first post here and my first pitch for Swift. Looking forward to the feedback 🙂 Introduction Swift 2 has introduced error handling mechanism, which has been widely adopted since. Shortly after that, XCTest added error catching support to its asse...
めっちゃタイムリーなスレがたってた。
Avatar
hironytic 21-Jan-19 02:50 AM
benrimmingtonさんの方法だとダメだけど、 XCTAssertNoThrow の引数にtestBookModelに相当するクロージャー渡すのでもダメなのかな?(試してない)
Avatar
omochimetaru 21-Jan-19 02:51 AM
XCTAssertNoThrowはそもそもObjectiveCだけみたい
このスレッドは、これをSwiftでも使えるようにしようって話かな
Avatar
hironytic 21-Jan-19 02:52 AM
ObjCだけ!そうなのか! 😖
Avatar
omochimetaru 21-Jan-19 02:52 AM
#define で定義された式展開マクロみたいですね、これはどうしようもない。
Avatar
hironytic 21-Jan-19 03:18 AM
XCTAssertNoThrow(try { let book = try BookModel(from: sampleDictionary) XCTAssertEqual(book.name, "...") XCTAssertEqual(book.description, "...") }())
これでいけるような気がする。
あ、ObjCだけなの忘れてたw
うん?いけるのでは?
Avatar
norio_nomura 21-Jan-19 05:00 AM
普通にLinuxでも使えるよね。 @swift-4.0.3 -frontend -repl
import XCTest :print_decl XCTAssertNoThrow
Avatar
swift40 BOT 21-Jan-19 05:00 AM
func XCTAssertNoThrow<T>(_ expression: @autoclosure () throws -> T, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)
Avatar
Avatar
omochimetaru 21-Jan-19 07:33 AM
あれ?ほんとうだ、右上のLanguageのところがグレーなので間違えました。。
Avatar
masakihori 21-Jan-19 08:12 AM
引数リストが違うから別物扱いってことですかね
Avatar
norio_nomura 21-Jan-19 08:26 AM
XCTAssertNoThrowのオリジナルはマクロの集合体で、シンボルとしては存在しないから、同じものとして扱っていないのでは。
#define XCTAssertNoThrow(expression, ...) \ _XCTPrimitiveAssertNoThrow(self, expression, @#expression, __VA_ARGS__) #define _XCTPrimitiveAssertNoThrow(test, expression, expressionStr, ...) \ ({ \ @try { \ (void)(expression); \ } \ @catch (NSException *exception) { \ _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_NoThrow, 0, expressionStr, [exception reason]), __VA_ARGS__); \ } \ @catch (...) { \ _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_NoThrow, 1, expressionStr), __VA_ARGS__); \ } \ }) …
Avatar
omochimetaru 21-Jan-19 08:27 AM
なるほど・・・ 他にもそういうのありそうですね
Avatar
omochimetaru 21-Jan-19 10:28 AM
ErrorをCustomStringConvertibleにするんじゃなくて、Foundation.LocalizedErrorにして、 var errorDescription: String? を実装してやれば、NSError変換されるときに勝手にlocalizedDescriptionになった。
こうするとXCTestでテストメソッドが例外で失敗したときもちゃんとコンソールに出る。
Avatar
norio_nomura 21-Jan-19 10:33 AM
なるほど。
Linuxでもそうなるかな。
🤔 1
Avatar
ikesyo 21-Jan-19 10:40 AM
この辺で対応した記憶があります https://github.com/apple/swift-corelibs-foundation/pull/810
This should return an appropriate value instead of the fixed "The operation could not be completed".
いや方向がちょっと違うかも? (edited)
https://github.com/antitypical/Result/pull/210 この辺絡みで直したんでした。Swift側で直接LocalizedErrorとしてアクセスする時だからやっぱりちょっと違いそうだけど関連はしてそう
ということで面白いのは _swift_Foundation_getErrorDefaultUserInfo これですかね
Avatar
omochimetaru 21-Jan-19 10:53 AM
localizedDescriptionがErrorに生えてるけど、これは型的にはNSErrorとは関係ない同名メソッドですか?
Avatar
ikesyo 21-Jan-19 10:56 AM
NSErrorへのbridingの流れをその時結構調べた気がするけど忘れてしまった (edited)
Avatar
norio_nomura 21-Jan-19 11:10 AM
LinuxはCustomStringConvertibleで良さげ。 @swift-4.0.3
import XCTest struct MyError: Error, CustomStringConvertible { var description = "my error" } class Test: XCTestCase { func testA() throws { throw MyError() } static var allTests = [("testA", testA)] } XCTMain([testCase(Test.allTests)])
Avatar
swift40 BOT 21-Jan-19 11:10 AM
exit status: 1 with stdout:
Test Suite 'All tests' started at 2019-01-21 20:10:23.991 Test Suite 'bin.xctest' started at 2019-01-21 20:10:23.993 Test Suite 'Test' started at 2019-01-21 20:10:23.993 Test Case 'Test.testA' started at 2019-01-21 20:10:23.993 <EXPR>:0: error: Test.testA : threw error "my error" Test Case 'Test.testA' failed (0.004 seconds) Test Suite 'Test' failed at 2019-01-21 20:10:23.997 Executed 1 test, with 1 failure (1 unexpected) in 0.004 (0.004) seconds Test Suite 'bin.xctest' failed at 2019-01-21 20:10:23.997 Executed 1 test, with 1 failure (1 unexpected) in 0.004 (0.004) seconds Test Suite 'All tests' failed at 2019-01-21 20:10:23.997 Executed 1 test, with 1 failure (1 unexpected) in 0.004 (0.004) seconds
Avatar
omochimetaru 21-Jan-19 11:13 AM
ああ、mac環境でも、Foundationをインポートすると生えるメソッドなんですね
Avatar
norio_nomura 21-Jan-19 11:20 AM
The XCTest Project, A Swift core library for providing unit test support - apple/swift-corelibs-xctest
Avatar
norio_nomura 22-Jan-19 12:55 AM
Windows版のNightlyビルド、Azure Pipelinesでビルドされてるのがあるのね。 https://dev.azure.com/compnerd/windows-swift/_build?definitionId=1
Avatar
norio_nomura 22-Jan-19 01:34 AM
まだSwiftPMとか含まれてなくて、試すには早かった。
Avatar
omochimetaru 22-Jan-19 03:26 AM
年明けぐらいにcompnerdさんが無料枠で構築してました
Avatar
norio_nomura 22-Jan-19 04:23 AM
ビルド所要時間に上限がないAzure PipelinesのOSSプランすごい。
Avatar
Kishikawa Katsumi 22-Jan-19 04:26 AM
それはいいですね。Travis CIも実質無限だけど。
Avatar
norio_nomura 22-Jan-19 04:29 AM
Travis CIは120分が上限ではないのかな?FAQに
Are there any restrictions on build time? A build has 120 minutes to run. Should your build take longer, you can split it up using a build matrix.
って書かれてる。 https://travis-ci.com/plans
Avatar
omochimetaru 22-Jan-19 04:29 AM
過去に40分?ぐらいで終了されちゃって詰んだ事がありました
Avatar
Kishikawa Katsumi 22-Jan-19 04:30 AM
Taskごとなので、テストケースを分割してタスクがそれにおさまるならJOB全体は何時間でもOKです。 っていうのが「実質」の部分です。
Avatar
omochimetaru 22-Jan-19 04:31 AM
なるほど。
Avatar
norio_nomura 22-Jan-19 04:31 AM
WindowsのNightlyは毎日3時間40分くらいかかってる。 https://dev.azure.com/compnerd/windows-swift/_build/results?buildId=109
Avatar
omochimetaru 22-Jan-19 04:31 AM
https://github.com/omochi/webrtc-ios-build WebRTCのフルビルドをシェルスクリプトから起動するしか無かったので、そういう分割の手もなかったです
Contribute to omochi/webrtc-ios-build development by creating an account on GitHub.
Azureの凄さを一つ知った
Avatar
norio_nomura 22-Jan-19 04:33 AM
しかもubuntu, macOS, Windows全部使える。
Avatar
omochimetaru 22-Jan-19 04:33 AM
え!?macOS?
Avatar
Kishikawa Katsumi 22-Jan-19 04:33 AM
Windowsが使えるのが大きいですねえ。
Avatar
norio_nomura 22-Jan-19 04:37 AM
Learn about using the Microsoft-hosted agents provided in Azure Pipelines
Azure Pipelines VM image generation for Microsoft-hosted CI/CD - Microsoft/azure-pipelines-image-generation
Avatar
Kishikawa Katsumi 22-Jan-19 04:39 AM
サイドプロジェクトで使ってみよう
Avatar
omochimetaru 22-Jan-19 04:39 AM
Learn how to configure CI⿍ for the app and platform of your choice using Azure Pipelines and Team Foundation Server (TFS). Includes tutorials, references, and other documentation.
ふむふむ
Avatar
norio_nomura 22-Jan-19 04:39 AM
SourceKitten, SwiftLint, YamsはCircleCIからAzure Pipelinesへ移行してしまいました。
Avatar
omochimetaru 22-Jan-19 04:40 AM
Travisの順番待ちより回せるならこっちのほうが良かったりするかも
An adorable little framework and command line tool for interacting with SourceKit. - jpsim/SourceKitten
本当だw 見慣れないバッジになってるw [Azure pipelines] (edited)
Avatar
norio_nomura 22-Jan-19 04:42 AM
決め手は、Azure PipelinesのOSSプランはどのOSのジョブも10個まで並列で起動できた事。CircleCIのOSSプランはmacOSが1~2個づつしか並列で起動できなかった。 (edited)
Avatar
omochimetaru 22-Jan-19 04:42 AM
おお、なるほど。
Avatar
norio_nomura 22-Jan-19 04:43 AM
docker使うジョブだけなら、dockerイメージのキャッシュが効くCircleCI が最速 の方が速い。 (edited)
Avatar
tarunon 01-Feb-19 02:19 AM
existentialだけに生えるextensionがほしい
Avatar
omochimetaru 01-Feb-19 02:50 AM
@tarunon 普通に書けばそうならないっけ?
Genericsパラメータに対する == で書いた場合だけか?
それ自体だとプロトコルに対するextensionになっちゃうのか。
Avatar
tarunon 01-Feb-19 02:51 AM
implにも生えちゃうし、デフォルト実装になっちゃう
そう
Avatar
omochimetaru 01-Feb-19 02:51 AM
その場合existentialにも生えるけど
protocolにも生えるのが嫌だって話?
Avatar
tarunon 01-Feb-19 02:51 AM
デフォルト実装はいらない
Avatar
omochimetaru 01-Feb-19 02:52 AM
要求の是非は置いといて、たしかに書けないね・・・
Avatar
tarunon 01-Feb-19 02:52 AM
existentialの時にもpropを取り扱いたいが、デフォルト実装が生えられるのはコンパイルエラーが破壊されて困る
Avatar
omochimetaru 01-Feb-19 02:56 AM
「コンパイルエラーが破壊されて」これ書き間違いじゃなくて本当にそういう意図か?
コンパイルエラーが本来は起きてほしいけれど、生えてしまうことでそれが解消されることで実装強制ができなくなる?
Avatar
tarunon 01-Feb-19 02:56 AM
語彙がおかしかった
強制が出来なくなるのが困る、そうです
Avatar
omochimetaru 01-Feb-19 02:57 AM
なるほどわかってきた
Avatar
tarunon 01-Feb-19 02:58 AM
あーー
いや、やろうとしてることも多少おかしいな
Avatar
omochimetaru 01-Feb-19 02:58 AM
// : Same-type constraint type 'P' does not conform to required protocol 'P' extension P where Self == P { func b() {} }
だめか〜〜〜wもしかしてこれで書けると思ったが。 (edited)
Avatar
tarunon 01-Feb-19 02:58 AM
protocol Aとprotocol Bがあって
Aのフィールドについて、Bのextensionに実装があるときに
struct C: A,Bとやると
デフォルト実装を見てしまう
Avatar
omochimetaru 01-Feb-19 03:02 AM
Bのデフォルト実装でAの要求が満たされちゃう?
それ自体は普段は望ましいけども。
Avatar
tarunon 01-Feb-19 03:02 AM
んと、Bの実装は実は、existentialだけあれば十分なのだ
Avatar
omochimetaru 01-Feb-19 03:03 AM
とりあえず現状の言語仕様だと、existentialを引数に取るトップレベル関数として実装するしか無さそう。
Avatar
tarunon 01-Feb-19 03:03 AM
多分、「existentialにequatableを生やしたい」と同じタイプの業
Avatar
omochimetaru 01-Feb-19 03:04 AM
あ、でも呼び出しは普通にメソッドじゃないと困るんかな
Avatar
tarunon 01-Feb-19 03:04 AM
概ねやろうとしていることが筋が悪いというのは理解していて
でもまぁやっちゃうよなぁという感じです
Avatar
omochimetaru 01-Feb-19 03:06 AM
言語が提供する(ex)Pに対して、手動で ExistentialP : P を作って、そいつのinitで ==Pしか受け取れないようにして・・・ (edited)
内部的にPじゃなくてExistentialPで保持するとか。
protocol P { func a() } struct ExP : P { let p: P func a() { print("existential") } } class Actor<T: P> { let p: T init(_ p: P) { self.p = ExP(p: p) } init(_ p: T) { self.p = p } }
こんな感じで解決できない?
Avatar
tarunon 01-Feb-19 03:11 AM
同じ事考えてたw
Avatar
omochimetaru 01-Feb-19 03:11 AM
一応、実行時オーバーヘッドは無いんじゃないかな。
ExPのレイアウトはPと同一化されて、メソッド呼び出しもstaticに解決するので。 (edited)
Avatar
tarunon 01-Feb-19 03:12 AM
多分無い、後は幾つか問題ありそうなところを解決すればokかな
Avatar
norio_nomura 14-Feb-19 12:17 PM
sourcekitd Stress Testerを試したけど、SWIFT_EXECを置き換えて起動するのは面白い。 https://swift.org/blog/sourcekitd-stress-tester/
Sourcekitd provides the data backing key editor features like code completion, semantic highlighting, and refactoring for Swift files in both Xcode and the recently announced SourceKit-LSP. To help improve its robustness, we’re introducing a new tool, the sourcekitd stress ...
Avatar
noppe 01-Mar-19 04:59 AM
https://swift-ast-explorer.kishikawakatsumi.com ずっとプログレス表示されているの自分だけですか…? 壊してしまったかもしれない…
Avatar
omochimetaru 01-Mar-19 04:59 AM
壊したの俺かもしれない
一瞬動いたけどさっき死んだ
kitaさんも
朝試したときは動いててここで確認したんですが、こっちでも固まって動かなくなってしまった...
Avatar
kitasuke 01-Mar-19 05:02 AM
僕が先に壊したかも... いろいろ試してたので
Avatar
Kishikawa Katsumi 01-Mar-19 05:30 AM
ずっとProgressですね。
ちょっとなんとかしてみます。 もし、便利に使ってらっしゃるなら、メンテできるようにアクセス権とかお渡しします。
希望があれば、、、ですけど。
@noppe @omochimetaru @kitasuke 戻りました。単にアプリを再起動しただけですが。
😊 2
Avatar
omochimetaru 01-Mar-19 05:37 AM
ありがとうこざいます
Avatar
Kishikawa Katsumi 01-Mar-19 05:38 AM
どうせできることは再起動くらいだから、ここからChatOpsでトリガーできるようにしといたらいいかもと思いました。そしたらなんかあったらとりあえず誰でも再起動できる。
Avatar
noppe 01-Mar-19 06:58 AM
SwiftSyntaxのmasterをspm経由で使っている方いますか? うまくビルドできず… swift-DEVELOPMENT-SNAPSHOT-2019-02-26-a.xctoolchain .package(url: "https://github.com/apple/swift-syntax.git", .branch("master")), の環境でやっているんですけど、SwiftSyntaxのビルドでSyntaxKindなどがないと怒られてしまいます。
Avatar
omochimetaru 01-Mar-19 07:45 AM
前うまくいったな
masterはだめなはずで
SwiftPM package for SwiftSyntax library. Contribute to apple/swift-syntax development by creating an account on GitHub.
Replace <#Specify Release tag#> by the version of SwiftSyntax that you want to use (see the following table for mapping details). Swift Release Tag SwiftSyntax Release Tag swift-4.2-RELEASE 0.40200.0
Swift側がSwift4.2 Release toolchainのときは
SwiftPMは 0.40200.0 (git tag)を
チェックアウトさせないといけない
Avatar
kitasuke 01-Mar-19 08:18 AM
masterはToolchainが最新だとビルドできる? (edited)
Avatar
omochimetaru 01-Mar-19 08:19 AM
新しい側は > Declare SwiftPM dependency with nightly build の説明でやるといけるんだと思う
master同士がちゃんと同期してるかはわからない
てか、SwiftPM側のsnapshot
全然ないし。
2日前に出てる02-26でtoolchainとSwiftPMを揃えたらいける気がする
Avatar
kitasuke 01-Mar-19 08:21 AM
master同士が同期してるかわからないの本当に運ゲーだわ。その組み合わせでやってみる
Avatar
norio_nomura 08-Mar-19 12:59 AM
Swift 5 Release Notes for Xcode 10.2 Beta 4の47326318ってSwift 4.2の変更だよね。 https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_beta_4_release_notes/swift_5_release_notes_for_xcode_10_2_beta_4 @swift-4.1.3 @swift-4.2.4 @swift-5.0.3
func forceCast<U>(_ value: Any?, to type: U.Type) -> U { return value as! U } let value: Any? = 42 print(forceCast(value, to: Any.self)) // Prints "Optional(42)" // (Prior to Swift 5, this would print "42".) print(value as! Any) // Prints "Optional(42)"
Avatar
swift42 BOT 08-Mar-19 12:59 AM
Optional(42) Optional(42)
stderr:
<stdin>:10:13: warning: forced cast from 'Any?' to 'Any' always succeeds; did you mean to use 'as'? print(value as! Any) ^~~ as
Avatar
swift41 BOT 08-Mar-19 12:59 AM
42 Optional(42)
stderr:
<stdin>:10:13: warning: forced cast from 'Any?' to 'Any' always succeeds; did you mean to use 'as'? print(value as! Any) ^~~ as
Avatar
swift50 BOT 08-Mar-19 12:59 AM
Optional(42) Optional(42)
stderr:
<stdin>:10:13: warning: forced cast from 'Any?' to 'Any' always succeeds; did you mean to use 'as'? print(value as! Any) ^~~ as
Avatar
omochimetaru 08-Mar-19 07:49 AM
I'd like to add more tests. Some guidance would be appreciated. Does this require swift-evo? I feel that it's an "obvious" feature.
struct Outer { typealias E = NestedValidation.T protocol NestedValidation { typealias T = A.B } }
Does this require swift-evo? I feel that it's an "obvious" feature.
さすがに必要やろ思った
Avatar
norio_nomura 08-Mar-19 12:36 PM
@swift-4.1.3 @swift-4.2.4 @swift-5.0.3 -swift-version 4.2
func foo<Value>(_ x: Any?, as type: Value.Type) -> Value? { return x as? Value } dump(foo(nil, as: Any.self))
-swift-version 5以外だと、Swift 4.1の挙動に戻るらしい…
(edited)
Avatar
swift42 BOT 08-Mar-19 12:36 PM
▿ Optional(nil) - some: nil
(edited)
Avatar
swift50 BOT 08-Mar-19 12:36 PM
- nil
(edited)
Avatar
swift41 BOT 08-Mar-19 12:37 PM
- nil
Avatar
norio_nomura 08-Mar-19 12:45 PM
-swift-version 4.2を付けることでSwift 4.2と非互換になるって、意味がわからん。
Avatar
tarunon 08-Mar-19 02:28 PM
swiftのバージョニング未だに解らない、、
Avatar
tarunon 08-Mar-19 02:42 PM
Xcode10.1のswift4.2と、Xcode10.2betaのswift4.2、見分けられないですよね?
ランタイムの動き違うから見分けられないと困るんですが…
Avatar
ikesyo 08-Mar-19 02:43 PM
#if compilerでは区別できそう? (edited)
Avatar
tarunon 08-Mar-19 02:45 PM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
これですね!
compiler(5.0)を入れれば良いのかな
Avatar
norio_nomura 13-Mar-19 04:45 AM
Xcode 10.2にはSwiftのスタティックリンクライブラリが添付されていないんだね。 SwiftLintやSourceKittenのmakefile内で、xcodebuildのバージョンによりswift buildへ渡す-Xswiftc -static-stdlibの有無を使い分ける必要があるぽい。
Avatar
kateinoigakukun 15-Mar-19 09:14 AM
@swift-4.2.4
class A {} struct Box<T: A> {} let box = Box() print(box)
Avatar
swift42 BOT 15-Mar-19 09:14 AM
Box<A>()
Avatar
omochimetaru 15-Mar-19 09:14 AM
ええw
Avatar
kateinoigakukun 15-Mar-19 09:14 AM
初めて知りました
少なくとも3.0.1からできるっぽい
Avatar
omochimetaru 15-Mar-19 09:15 AM
Genericsの上界がclassだとデフォルト推論なのか
Avatar
tarunon 15-Mar-19 09:17 AM
asは通るけど変数の型にはできない
Avatar
omochimetaru 19-Mar-19 03:15 PM
Hi Swift Community, The review of SE-0249: Key Path Expressions as Functions begins now and runs through March 27, 2019. Reviews are an important part of the Swift evolution process. All review feedback should be either on this forum thread or, if you would like to keep you...
users.map(\.email)
// `self` key paths [1, nil, 3, nil, 5].compactMap(\.self)
↑これオシャレでいいな。 { $0 } の意味。
Avatar
t.ae 20-Mar-19 12:36 AM
RxでありがちなboolObservable.filter { $0 }も同様に書ける?
Avatar
tarunon 20-Mar-19 12:37 AM
できそう
Avatar
kateinoigakukun 20-Mar-19 12:41 AM
RACのmapはこの記法ができてオシャンに書ける
Avatar
omochimetaru 20-Mar-19 01:08 AM
オペレータ側でKeyPath受けるオーバーロードがあるのか。
Avatar
tarunon 23-Mar-19 07:56 AM
<T>にAnyが入れれるのはある種のself conformanceなのかな
Avatar
koher 23-Mar-19 10:43 AM
@swift-4.2.4
func foo<T>(_ t: T) { print(t) } let a: Any = 42 foo(a)
Avatar
swift42 BOT 23-Mar-19 10:43 AM
42
Avatar
koher 23-Mar-19 10:43 AM
@swift-4.2.4
func foo<T: Any>(_ t: T) { print(t) } let a: Any = 42 foo(a)
Avatar
swift42 BOT 23-Mar-19 10:43 AM
42
Avatar
koher 23-Mar-19 10:44 AM
@swift-4.2.4
func foo<T: AnyObject>(_ t: T) { print(t) } class C {} let a: AnyObject = C() foo(a)
Avatar
swift42 BOT 23-Mar-19 10:44 AM
main.C
Avatar
koher 23-Mar-19 10:46 AM
@swift-4.2.4
func foo<T: Error>(_ t: T) { print(t) } struct E: Error {} let a: Error = E() foo(a)
Avatar
swift42 BOT 23-Mar-19 10:46 AM
exit status: 1 with stderr:
<stdin>:8:1: error: cannot invoke 'foo' with an argument list of type '(Error)' foo(a) ^ <stdin>:8:1: note: expected an argument list of type '(T)' foo(a) ^
Avatar
koher 23-Mar-19 10:46 AM
@swift-5.0.3
func foo<T: Error>(_ t: T) { print(t) } struct E: Error {} let a: Error = E() foo(a)
Avatar
swift50 BOT 23-Mar-19 10:46 AM
E()
Avatar
koher 23-Mar-19 10:48 AM
他にあるかな?
Avatar
Kishikawa Katsumi 01-Apr-19 03:16 PM
Hi swift-evolution, I've been working on a pitch I think you're all going to love, as well as the corresponding implementation Control Flow Negation Statements Proposal: SE-NNNN Author: Harlan Haskins Review Manager: TBD Status: Awaiting review Implementation: apple/sw...
Avatar
omochimetaru 01-Apr-19 05:17 PM
Introducing a new code visualizer for Swift: Source Is View. https://t.co/HWnAaflYrC
こっちもエイプリル、JRose氏もBaba is youやってるのかw
Baba Is You is an award-winning puzzle game where you can change the rules by which you play. In every level, the rules themselves are present as blocks you can interact with; by manipulating them, you can change how the level works and cause surprising, unexpected interactio...
Price
$14.99
Recommendations
831
Metacritic
83
Avatar
Kishikawa Katsumi 02-Apr-19 01:12 AM
Control Flow Negation Statementsはちゃんとした名前であったら便利だと思う。 unlessでいいんじゃないか。
Avatar
masakihori 02-Apr-19 01:37 AM
guardn't 欲しい
Avatar
omochimetaru 02-Apr-19 02:47 AM
if + 脱出保証はちょっと欲しい
Avatar
Kishikawa Katsumi 02-Apr-19 02:49 AM
if #available の否定ほしい
Avatar
usatie 03-Apr-19 05:08 AM
Date のreference dateが2001/1/1なのってどういう理由があるかって誰かご存知ないですか?ただ気になっただけなのですが笑
🤔 1
Avatar
usatie 03-Apr-19 05:16 AM
https://nshipster.com/timeinterval-date-dateinterval/ Matttさんも疑問とのことで >>>While we’re on the subject of conjectural sidebars, does anyone know why Apple created a new standard instead of using, say, the Unix Epoch (January 1, 1970)? 2001 was the year that Mac OS X was first released, but NSDate pre-NSDates that from its NeXT days. Was it perhaps a hedge against Y2K? (edited)
Our limited understanding of time is reflected in — or perhaps exacerbated by — the naming of the Foundation date and time APIs. It’s about time we got them straight.
Avatar
Kishikawa Katsumi 10-Apr-19 07:29 AM
GoogleのCloud Run、触ってみたい感じなんですけどSwiftのPlaygroundを移したら今より楽になったりするかな?
Avatar
omochimetaru 10-Apr-19 07:30 AM
@1amageek The next step is to build an open source function framework for Swift, based on our Node one: https://t.co/PzBlKu50bk
Avatar
Kishikawa Katsumi 10-Apr-19 07:31 AM
そう。任意のコンテナをServerlessの実行環境で使った分だけ課金、置いとくぶんには料金かからない、という感じで理解しています。
今はDigitalOceanを使っていて、Swiftのバージョンを増やすのがそろそろ容量いっぱいいっぱいだし、スケールもしないし(しても困るという話もあるけど)。
Avatar
omochimetaru 10-Apr-19 07:32 AM
サンドボックスで実行するところがちょうどそのままCloud Runにできるのかな コードは事前に静的に置くだったりするとだめそう? (edited)
Avatar
Kishikawa Katsumi 10-Apr-19 07:33 AM
パラメータを渡したりはできるんじゃないかな(わかってない)。
Avatar
omochimetaru 10-Apr-19 07:34 AM
Swiftのバージョンを増やすのがそろそろ容量いっぱいいっぱいだし
なるほどw
Avatar
Kishikawa Katsumi 10-Apr-19 07:34 AM
今複数バージョンの環境をデプロイしてあって、それはとても便利だけど、頻繁に使われるのは現行バージョンと1つ前くらいだし。
Swiftの環境はそもそもでかいし、Dockerイメージも基本的に小さくならないんですよ。
Avatar
omochimetaru 10-Apr-19 07:40 AM
const result = require('child_process').execSync('docker images kishikawakatsumi/swift --format "{{.Tag}}"').toString();
なるほど
Avatar
norio_nomura 10-Apr-19 08:28 AM
僕がHerokuで動かしてるのと同じ感じになりそう。
Avatar
Kishikawa Katsumi 10-Apr-19 08:28 AM
そんな感じかと思うんですよね。スピンアップの時間に違いがあったりするかな?
Avatar
norio_nomura 10-Apr-19 08:29 AM
Webアプリにしたいのですよね?
Avatar
Kishikawa Katsumi 10-Apr-19 08:31 AM
^ ごめんなさい、質問の意味がわかりませんでした。
Avatar
norio_nomura 10-Apr-19 08:34 AM
入力はRESTで受け取る?
Docker in Dockerをサポートしてるとは思えないから、複数ツールチェインを切り替えて使いたいなら、実行を受け持つサーバーをツールチェインの数だけ建てるのかな。
Avatar
Kishikawa Katsumi 10-Apr-19 08:36 AM
実行を受け持つサーバーをツールチェインの数だけ建てるのかな。
おそらくそうです。 今Webインターフェースを提供するa) Nodeアプリとb) Swiftの実行を担当するDockerイメージ複数が1つのサーバにあるので、 bをCloud Runに置く、ということになるのかなと。
置いとくだけならお金かからないということですし。
Avatar
norio_nomura 10-Apr-19 08:41 AM
HerokuのWebアプリケーションと同じに見える。>Cloud Run
Cloud Runは無料枠が無さげ?
いや無料枠あるのか。
Swiftの環境はそもそもでかいし、Dockerイメージも基本的に小さくならないんですよ。
僕が公開してるSwiftのDockerイメージは、基本部分が共通イメージになるようにしてるので、複数バージョンのSwiftをpullした時に全体の容量を極力減らすようにしてある。
(edited)
Avatar
Kishikawa Katsumi 10-Apr-19 08:54 AM
なるほど。
Avatar
norio_nomura 10-Apr-19 09:15 AM
Container RegistryはGoogle以外も使えるのかな。
Avatar
norio_nomura 10-Apr-19 09:25 AM
ほとんどの Container Registry ストレージ バケットに使用されるデフォルトの Cloud Storage クラスは、Multi-Regional です。 Multi-Regional バケットの月額料金は、約 $0.026/GB です。
https://cloud.google.com/container-registry/pricing
Avatar
Kishikawa Katsumi 10-Apr-19 09:26 AM
あれ、置いとくだけでお金かかります?
ということ?
Avatar
norio_nomura 10-Apr-19 09:28 AM
イメージをGoogle Cloud以外に置なければ、そうなりますね。
この辺りはHerokuの方が緩い。
Avatar
norio_nomura 10-Apr-19 09:37 AM
イメージをプライベートにしたいとか無ければGoogle Cloud以外に置いても使えるとは思いますが、チュートリアル通りに作るとGoogle Cloud Registoryへ置くのでCloud Storageの料金がかかると思います。 (edited)
Avatar
Kishikawa Katsumi 10-Apr-19 09:38 AM
じゃあ金銭の節約にはならないかなあ。
Avatar
norio_nomura 10-Apr-19 09:46 AM
とりあえず、Swiftの実行を担当するDockerイメージにRESTで入出力出来る様にしておくのは、無駄にはならない気がします。
Avatar
omochimetaru 11-Apr-19 02:22 AM
struct Stone { var a: Int var b: Int init(a: Int = 10 * 2 + 3 /*草*/ - (5 + 2), b: Int = 20) { self.a = a self.b = b } }
// SIL struct Stone { @_hasStorage var a: Int { get set } @_hasStorage var b: Int { get set } init(a: Int = 10 * 2 + 3 /*草*/ - (5 + 2), b: Int = 20) }
ここはテキスト的に埋め込まれてるだけで意味は無いっぽいけど。
Avatar
koher 17-Apr-19 12:46 PM
↓ path-dependent type なるものが必要らしい。
func nthOfEach( _ n: Int, from heterogeneousCollections: [any Collection] ) -> Any { return heterogeneousCollections.map { collection in // collection is `any Collection` let nthIndex = collection.startIndex.advanced(by: n) // error: inferred static type of nthIndex is something like `any Collection.Index`, // so compiler can’t guarantee it indexes `collection` … correct? return collection[nthIndex] } }
https://forums.swift.org/t/se-0244-opaque-result-types-reopened/22942/49
These examples require “path-dependent types” to work. There are some examples in the old enhanced existentials draft (although it does not use the term path-dependent types). Also, fwiw Scala’s type system supports this feature. I don’t know Scala in depth so I’...
Avatar
omochimetaru 17-Apr-19 05:38 PM
現状のAnyCollectionはIndexが実行時エラーの可能性をはらんでるみたいですね。
func main() { let ac = AnyCollection<Int>([1]) let s = AnyCollection<Character>("str") let x = ac[s.startIndex] // Fatal error: Index type mismatch! } main()
Avatar
koher 18-Apr-19 12:01 AM
path-dependent type があれば、↑をコンパイルエラーとして検出し、↓のコンパイルを通せるのか。
let ac = AnyCollection<Int>([1]) let x = ac[ac.startIndex]
Avatar
omochimetaru 18-Apr-19 12:03 AM
↑これだけならsome Collectionでできますね もう一回Arrayに包んだ時のことかと
Avatar
koher 18-Apr-19 12:09 AM
これと同等のことをやりたいということではなく、 AnyCollection を使った場合に↑の二つのコードを区別してコンパイル時の挙動を変える話。
現在は実行時エラー側に倒されてるけど、 path-dependent type で実行時エラーになるケースだけをコンパイルエラーにできるんじゃないのかな?
Avatar
omochimetaru 18-Apr-19 12:12 AM
AnyCollectionを安全にする話なのか。
Avatar
koher 18-Apr-19 12:19 AM
AnyCollection というか generalized existential の問題の話で、同じことが type erasure でも言えるということじゃないかな。 (edited)
AnyCollection って AnyCollection<Element, Indices> とかの方がよかったのでは・・・。 (edited)
Avatar
omochimetaru 18-Apr-19 12:21 AM
any Collectionの場合
インデックスは取れるけど渡せない になるのか?
Avatar
koher 18-Apr-19 12:21 AM
IteratorSubSequence はいいけど、 Indices が定まらないのはいいのかな・・・。 (edited)
Avatar
omochimetaru 18-Apr-19 12:22 AM
自動定義されるany Protoにおいて
assoctypeが絡むメンバーのシグネチャというか
ジェネリクスの変性的なやつがどうなるのか
ちゃんとわかってない
既存の手動定義系はAnyIndexとかになってて、型の不一致でクラッシュ。
Avatar
koher 18-Apr-19 12:24 AM
この前の Self 戻り値はいいけど引数はダメみたいな話?
Avatar
omochimetaru 18-Apr-19 12:25 AM
そうですね any Protoは全てのProtoのスーパータイプのはずなので。
Avatar
koher 18-Apr-19 12:27 AM
手動定義の場合は AnyCollection<Element, Indices> にすれば型安全にできる気がするけど、 generalized existential って必ずしもすべての associated type を指定しなければならないわけじゃないから、その辺りの型安全性を解決するのに path-dependent type が必要という話なんじゃないかな? (edited)
Avatar
omochimetaru 18-Apr-19 12:27 AM
# 概要 Swiftのprotocolには型の性質を記述する機能と、存在型として使用する機能があります。その存在型はそれ自身のprotocolに準拠しません。その理由は、スタティックメンバに関して問題が生じるからで...
↑最近考えたんだった
Avatar
koher 18-Apr-19 12:28 AM
AnyCollection の場合は Indices を型パラメータにしなかったのでそれを指定する手段がないから実行時エラーにするしかない。
↓を型安全にできるようにする話な気がする。
func g(_ x: P) { let a = x.value x.value = a }
Avatar
omochimetaru 18-Apr-19 12:29 AM
まあ、Indicesもパラメータ化すればそうだけど、他のassoctypeについても同じ問題が起きるし
Avatar
koher 18-Apr-19 12:29 AM
path-dependent type についてはよくわからないけど、 Scala にあるっていうから Scala を勉強すればわかるかも。
Avatar
omochimetaru 18-Apr-19 12:30 AM
型パラメータにしないことでIndex違いを全部まぜて代入できたりするから
そこは正解はなくて性質をコントロールできたら良い気がする
Avatar
koher 18-Apr-19 12:31 AM
それを代入できないようにするんじゃないかな?
Avatar
omochimetaru 18-Apr-19 12:31 AM
えっと、代入できるスーパータイプとしての利便性は別途存在するという意味です
どっちが良いとかじゃなくて
別の道具
Avatar
koher 18-Apr-19 12:33 AM
Joe_Groff >> anandabits Matthew Johnson
>> These examples require “path-dependent types” to work. There are some examples in the old enhanced existentials draft (although it does not use the term path-dependent types). >> >> Also, fwiw Scala’s type system supports this feature . I don’t know Scala in depth so I’m not sure how closely it relates to what we might have in Swift but you might find it interesting to look at how Scala handles this.
This would be my in-an-ideal-world choice for how existentials eventually work in Swift.
https://forums.swift.org/t/se-0244-opaque-result-types-reopened/22942/53
This would be my in-an-ideal-world choice for how existentials eventually work in Swift.
代入できるスーパータイプとしての利便性は別途存在するという意味です
この場合でも、↑の value プロパティについて、コードのフローを考慮して同じ型であることが保証できる場合のみ代入できるようにするとか?
Avatar
omochimetaru 18-Apr-19 12:39 AM
なるほど。でも解析できないけど実は正しい場合とかが生じそう
実行時に構築される値を使って辞書に出し入れしたりしたら
値の同一性が追跡できない場合が出てくる
逆か 静的解析で間違ってることがわかる場合にだけコンパイルエラーにする ならいけそう
Avatar
koher 18-Apr-19 12:44 AM
わからなくて間違ってる場合は実行時エラー?
Avatar
omochimetaru 18-Apr-19 12:44 AM
はい
Avatar
koher 18-Apr-19 12:45 AM
もしくは、コンパイルエラーだけど、明示的に指定してまちがってて実行時エラー化する手段を提供するか? as! 的な。
そっちの方が安全よりそう。
Avatar
omochimetaru 18-Apr-19 12:51 AM
あー、なるほど。その方がSwiftらしいですね
Avatar
tarunon 18-Apr-19 03:56 AM
Genericsのデフォルトパラメーターがあれば解決するとかそういう話ですかね
型パラ増やしすぎたくないけどこの場合に破壊が起きるみたいな
そういう雰囲気を感じた
Avatar
omochimetaru 18-Apr-19 03:57 AM
デフォルトパラメータは見かけ上埋めないだけでパラメータは存在してるので、それはまた違う (edited)
もしAnyCollectionにElementパラメータがなかったとしたら
Array<Int> is AnyCollection かつ Array<String> かつ AnyCollection がなりたつ
もしAnyCollectionのElementパラメータにデフォルトパラメータがあったとしても、 AnyCollectionって書いた時、見えないだけで Element = Int だったり = String だったりするので↑の両方は成り立たない
Avatar
tarunon 18-Apr-19 03:59 AM
Indicesの差を実行時に死ぬかコンパイル時に検知するかという話で
やればいいじゃん?としか思わないんだけど、やりたくない理由が型パラの見かけの問題なのか、と思ったのである
Avatar
omochimetaru 18-Apr-19 04:04 AM
@swift-5.0.3
let cs: [Character] = ["a", "b"] let str: String = "cde" func concat<T>(_ a: AnyCollection<T>, _ b: AnyCollection<T>) -> [T] { return a.map { $0 } + b.map { $0 } } let r = concat(AnyCollection(cs), AnyCollection(str)) print(r)
Avatar
swift50 BOT 18-Apr-19 04:04 AM
["a", "b", "c", "d", "e"]
Avatar
omochimetaru 18-Apr-19 04:05 AM
@swift-5.0.3
let cs: [Character] = ["a", "b"] let str: String = "cde" func concat<T>(collections: [AnyCollection<T>]) -> [T] { return collections.reduce([]) { $0 + $1.map { $0 } } } let r = concat(collections: [AnyCollection(cs), AnyCollection(str)]) print(r)
Avatar
swift50 BOT 18-Apr-19 04:05 AM
["a", "b", "c", "d", "e"]
Avatar
omochimetaru 18-Apr-19 04:06 AM
↑これはIndexがパラメータになってると書けない
Avatar
tarunon 18-Apr-19 04:06 AM
書けなくて良いのでは
str.mapなりしてIndexをIntに書き下してからやるのが正しいと思う
「書けなくて良い」というか、むしろ「書けるのはやばい」とすら言えると思うのだけど。
Avatar
omochimetaru 18-Apr-19 04:08 AM
それでいうとそもそもAnyCollectionを使いたい状況に遭遇したことがなくてあんまり想像つかないけど
俺の意見としては、
AnyCollectionを手書きしてる世代はどうでもよくって
any Collection って書けるようになれば
どのパラメータを固定するか自由に選べるようになるから
状況に応じて決められるようになって全部解決する
現時点だと、 some Collection は全部を固定する
Avatar
tarunon 18-Apr-19 04:09 AM
そうだね
Avatar
omochimetaru 18-Apr-19 04:10 AM
けど、Future Directionとしては、
func hoge<T>() -> some Collection<.Element == T>
とかを許すので
(edited)
そっからいくと any Colleciton とか any Collection<.Element == Int> とか any Collection<.Element == Int, .Index == Int> (edited)
が使い分けられるようになるので。
あと、Element, Index を固定してもまだ Iterator とか SubSequence とかがあるから、
常に全部を固定すべき、とは言い切れないんじゃないかなあ
固定しなかったパラメータに関してからなずしもクラッシュケースが発生するわけでもないし。 AnyEquatable同士を == するときとかはそういうパターン。
本来の <T: Equatable> は T 同士にしか対応してないけど、Any で その固定を外しちゃってるけど動く。
Avatar
tarunon 18-Apr-19 04:23 AM
問題は
Avatar
tarunon 18-Apr-19 04:46 AM
シャットダウンしてもうた
問題はIndexを直接見るような状況でIndexが不定、みたいなのは壊れちゃうね。
Avatar
omochimetaru 18-Apr-19 04:48 AM
そうだね、AnyCollectionに対してIndex操作をする用途だと固定されてたほうが嬉しい
多分、 any Collection<.Element == Int> の場合
Indexが絡むメソッドは使えないんじゃないか・・・?
それとも Index: any Comparable として生成されるのかな、それだと例のクラッシュがありえるけど
Avatar
koher 18-Apr-19 05:09 AM
それが↓のコンパイルエラーの話なんじゃないかな?
func nthOfEach( _ n: Int, from heterogeneousCollections: [any Collection] ) -> Any { return heterogeneousCollections.map { collection in // collection is `any Collection` let nthIndex = collection.startIndex.advanced(by: n) // error: inferred static type of nthIndex is something like `any Collection.Index`, // so compiler can’t guarantee it indexes `collection` … correct? return collection[nthIndex] } }
Avatar
omochimetaru 18-Apr-19 06:12 AM
so compiler can’t guarantee it indexes collection … correct?
ああ、たしかに、そうっぽい
Avatar
t.ae 19-Apr-19 08:02 AM
mutating func Array.clip(low, high)みたいなextensionをはやしてて、数が多くなってきたのでArray.ex.clip(low, high)に移したいなと思ったんですが値型だとこれできないですよね……
Avatar
omochimetaru 19-Apr-19 08:04 AM
subscriptならできる
Avatar
t.ae 19-Apr-19 08:05 AM
subscriptというかsetter?
extension Array { var ex: Ex<Element> { get { return Ex(self) } set { self = newValue.array } } }
そういえば昔やった記憶がある
Avatar
omochimetaru 19-Apr-19 08:06 AM
あれ?そっか、できるじゃん。
Avatar
t.ae 19-Apr-19 08:06 AM
これの問題点はexをどっかに代入されたときなんですよね。
Avatar
omochimetaru 19-Apr-19 08:07 AM
まあそのときは書き戻しは無し、で良いのでは
.ex 方式、そもそもあんまりよくない気もする
使いたくなければimportしなければ名前空間は汚染されないよね?
Avatar
t.ae 19-Apr-19 08:08 AM
それが一番よさそうですね。
単純にネームスペース切れる方法を用意してもらえるほうが嬉しいんですが。
使いたくなければimportしなければ名前空間は汚染されないよね?
そうですね。
Avatar
Kishikawa Katsumi 19-Apr-19 08:09 AM
そのまま使える方が私も良いと思っています。分けたければモジュールを分ける、は賛成です。
Avatar
omochimetaru 19-Apr-19 08:09 AM
数が多くなってきたので
なんか動機が違いそうだな
Avatar
t.ae 19-Apr-19 08:09 AM
例示なんでArrayで書きましたけど本当は自作の型で、いろいろ生えてる感じなんです。
でそれを今整理中で
Avatar
omochimetaru 19-Apr-19 08:11 AM
自作の型ならなおさら、同居させて良い気がするけどなあ
Avatar
t.ae 19-Apr-19 08:11 AM
数が多いのだけでなく粒度が結構違うんですよね
Avatar
omochimetaru 19-Apr-19 08:11 AM
実例が気になる
Avatar
Kishikawa Katsumi 19-Apr-19 08:12 AM
そっすね。具体例が気になります。
Avatar
t.ae 19-Apr-19 08:12 AM
Image library for Swift. Contribute to t-ae/swim development by creating an account on GitHub.
Image library for Swift. Contribute to t-ae/swim development by creating an account on GitHub.
上がextension化したもので下がまだのやつです。下はmutatingが出てくる。
粒度というか機能的にいくつかまとまりがあってそれらが全部フラットに入ってるとごちゃごちゃするのが嫌って感じでしょうか。 (edited)
説明が雑だったので付け加えると、画像のImage型にいろいろメソッドを生やしてたけど雑然としてきたので整理したいというところです。
Avatar
omochimetaru 19-Apr-19 08:15 AM
Image.resizeとImage.convertが両方あっても良いというか
そんなに粒度が違う感じもしない
強いて言えば、 convertじゃなくて convertPixelwise とかのほうが良いかもしれんが
mapPixel とか。
Avatar
t.ae 19-Apr-19 08:16 AM
粒度は言葉が悪かったです。 >粒度というか機能的にいくつかまとまりがあってそれらが全部フラットに入ってるとごちゃごちゃするのが嫌って感じでしょうか。
scikit-imageの分割を参考にしています。 https://scikit-image.org/docs/dev/api/skimage.transform.html
Avatar
omochimetaru 19-Apr-19 08:19 AM
ごちゃごちゃするっていうのは、Xcodeで補完候補を出す時とかの事?
Avatar
t.ae 19-Apr-19 08:19 AM
はい。
Avatar
omochimetaru 19-Apr-19 08:20 AM
例えばUIViewだと
↑のメソッドが、ジャンルごとにグルーピングされていて
Configuring a View’s Visual Appearance, Configuring the Event-Related Behavior, Configuring the Bounds and Frame Rectangles
みたいにグループで書いてあるので
このグループ名みたいなのをコードかコメントで記述できて、
Xcodeが補完するときにそのまとまりで出してくれたら
問題は解決する気がする。
そういうのがあったら、実際に型システム上はフラットになっていたとしても問題はない。
Avatar
t.ae 19-Apr-19 08:22 AM
そういうのがあったら嬉しいですね。
Avatar
omochimetaru 19-Apr-19 08:22 AM
今はないしそういうディスカッションを見た記憶もないけど・・・
こういうHTMLみたいにコードの外でドキュメントを提供することでも
解決するのかな
Avatar
t.ae 19-Apr-19 08:25 AM
namespaceのほうはフォーラムでちょくちょく見てた気がしますけどそっちのアプローチは見覚えないですね。
Avatar
omochimetaru 19-Apr-19 08:26 AM
確かにメソッドのネームスペースの話題はあった気がする
.ex方式だと、コードが長くなるから、読みやすさが少し低下するのと、
オーバーヘッドがあるからパフォーマンスも少し低下しちゃう
Avatar
t.ae 19-Apr-19 08:27 AM
オーバーヘッドは確かに。
Avatar
omochimetaru 19-Apr-19 08:27 AM
補完ごちゃごちゃは書く時の話で、書く時と読む時のトレードオフなら読む時を重視したほうが良いと思ってる
Avatar
kateinoigakukun 20-Apr-19 04:15 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
👀 1
Optional.mapには付いてるからResult.mapにも付いてておかしくないと思ったんですが。
Avatar
omochimetaru 20-Apr-19 04:18 AM
インライン化するところってどうやって決めてるんだろう
導入時のPRのコミットを追ってけばなんかわかるかも?
Avatar
kateinoigakukun 20-Apr-19 04:22 AM
This PR adds the updated Result implementation for SE-0235, as I broke the last PR when trying to rebase off of @rjmccall&#39;s Error self conformance PR. Previous PR discussion and review was ...
うーん、触れられて無さそう
フォーラムで聞いてみます
Avatar
omochimetaru 20-Apr-19 04:23 AM
他のところも1つも付いてないのか
Avatar
kateinoigakukun 20-Apr-19 04:23 AM
ですね
こういう話題ってカテゴリは何に当たるんだろう
Developmentでいいのか
Avatar
omochimetaru 20-Apr-19 04:26 AM
コンパイラタグと開発タグがある
開発が大カテゴリか
Avatar
kateinoigakukun 20-Apr-19 04:34 AM
I noticed methods of Result like Result.map, Result.flatMap and so on are not inlinable even though Optional things are inlinable. This topic wasn't discussed in PR of SE-0235 but I think it would make sense to change them as inlinable. Is there some reasons to be non-inlin...
立てた
Avatar
kateinoigakukun 20-Apr-19 06:40 AM
ResultのPR作者から返信きたけどこれはABI Stabilityに関係あるのか? https://forums.swift.org/t/why-is-result-map-implemented-as-non-inlinable-method/23410/2 (edited)
No reason, other than I didn’t think about it and wasn’t told to do so. At this point I’m not sure it would be possible due to ABI stability.
Avatar
koher 22-Apr-19 12:50 AM
Result は標準ライブラリの型だから、 @inlinable がなくても specialize は行われるっていう認識でいいのかな?それだと "benchmarked to check if it's beneficial and not harmful" を作るのは更に難しそう。 (edited)
Avatar
omochimetaru 22-Apr-19 01:04 AM
標準ライブラリの中でもinlinableが付いてる箇所と付いてない箇所があるから、標準ライブラリだからって特別扱いは無さそう Array専用の最適化とかはあるみたいだけどResultに対してはなさそう
ABIStabilityは実行ファイルはそのままで標準ライブラリが新しいものになる時の話だから、 インライン化されるとアプリ側にコードが埋め込まれてロックされるので、 将来のバージョンで処理を変えられなくなる、 関わる型のレイアウトが変わると死ぬ(fixedの場合) そこから呼ばれてる関数が無くなってると死ぬ
などの制約があると思うけどわからん
I'll measure performance and propose this again
これだけど、ベンコーヘンのレスからすると
インライン化が良いか悪いかは、それを使ってるコードにも寄るってことは
多くのプロジェクトがResultを導入してコード例が多くならないと実質評価できない気がする
Optionalは最初から標準ライブラリの中などで多用されるからそれが調べられるけど
Resultは標準ライブラリの中からはほぼ使われないだろうし・・・
Avatar
kateinoigakukun 22-Apr-19 01:19 AM
そうなんですよね、まだ大して使われてない…
標準ライブラリ内のユースケースならチェインすることも多くなさそうだし。
Avatar
koher 22-Apr-19 01:21 AM
標準ライブラリの API が @inlineable 以前から specialize された件って、 @_inlinable とかのおかげだったってこと?
Avatar
omochimetaru 22-Apr-19 01:23 AM
はい、そう思ってます>アンスコ付き
ArrayとかStringも@semanticって特別なアトリビュートで
マークされてる部分とかがあって
「標準ライブラリである」って知識はコンパイラの中で最低限にされてるようにみえる
秘密のマーク方法があって、コンパイラはそれを見てて、ライブラリはそのマークを使うから特別
Avatar
koher 22-Apr-19 01:25 AM
なるほど。標準ライブラリだと特殊な処理がされてて無条件に specialize 可なのかと思ってた。
Avatar
omochimetaru 22-Apr-19 01:26 AM
型推論のところでoptional用の変換とかハードコードされてたりもするので完全にそうとも言い切れないけど・・
標準ライブラリ内のユースケースならチェインすることも多くなさそうだし。
確かにmap自体が使われない・・・
Avatar
t.ae 23-Apr-19 03:44 AM
@swift-5.0.3
public struct MyStruct1 { public internal(set) var x: Int @inlinable public init(x: Int) { self.x = x } } public struct MyStruct2 { @usableFromInline public internal(set) var x: Int @inlinable public init(x: Int) { self.x = x } }
Avatar
swift50 BOT 23-Apr-19 03:44 AM
exit status: 1 with stderr:
<stdin>:11:5: error: '@usableFromInline' attribute can only be applied to internal declarations, but 'x' is public @usableFromInline ^~~~~~~~~~~~~~~~~ <stdin>:6:9: error: setter for 'x' is internal and cannot be referenced from an '@inlinable' function self.x = x ^ <stdin>:2:30: note: setter for 'x' is not '@usableFromInline' or public public internal(set) var x: Int ^ <stdin>:16:9: error: setter for 'x' is internal and cannot be referenced from an '@inlinable' function self.x = x ^ <stdin>:12:30: note: setter for 'x' is not '@usableFromInline' or public public internal(set) var x: Int ^
Avatar
t.ae 23-Apr-19 03:45 AM
どっちもできなくて詰んでる。
Avatar
omochimetaru 23-Apr-19 03:46 AM
computed propertyにしよう (edited)
Avatar
t.ae 23-Apr-19 03:46 AM
そうですね。それが良さそう。
Avatar
norio_nomura 23-Apr-19 04:03 AM
面白いバグだw
Avatar
t.ae 23-Apr-19 05:48 AM
https://bugs.swift.org/browse/SR-10340 すでに報告上がってましたけどコメントで対処はsetメソッドを作る方法で書かれてますね。 computed propertyのほうが外見は良いですがバッキングフィールドの定義が要るので一長一短か。 (edited)
Avatar
omochimetaru 23-Apr-19 12:08 PM
バイパス用のsetterを手書きするのでもいいか、なるほど。
Avatar
t.ae 24-Apr-19 02:13 AM
func testMultiplyPixel() { var rgba = [Double](repeating: 1, count: 4) let scalar: Double = 0.99 measure { // 0.108sec for _ in 0..<1000000 { rgba.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } } } } func testMultiplyPixel3() { var rgb = [Double](repeating: 1, count: 3) let scalar: Double = 0.99 measure { // 0.141sec for _ in 0..<1000000 { rgb.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } } } }
要素4つのほうが3つより早いという直感に反する結果に……
Avatar
omochimetaru 24-Apr-19 02:15 AM
ほ〜 結構異なったバイナリになってそう
使ってるメモリ領域は小さいから、4つのケースでうまいこと専用命令になったとか?
検証するのが難しいな
コマンドラインまで落とせれば $swiftc --emit-assembly だけど
Avatar
t.ae 24-Apr-19 02:20 AM
[araki@Arakis-MBP No Backup]$ diff main3.txt main4.txt 22c22 < movl $3, %ecx --- > movl $4, %ecx
定数以外同じですねぇ (edited)
Avatar
omochimetaru 24-Apr-19 02:21 AM
main3.txtはどうやって作った?
Avatar
t.ae 24-Apr-19 02:21 AM
あ、-Oついてなかった
[araki@Arakis-MBP No Backup]$ diff main3.txt main4.txt 35c35 < movl $3, %edi --- > movl $4, %edi 37c37 < movq $3, 16(%rax) --- > movq $4, 16(%rax) 40,41c40 < movabsq $4607182418800017408, %rcx < movq %rcx, 48(%rax) --- > movupd %xmm0, 48(%rax)
-Oつけたらこうでした。
[araki@Arakis-MBP No Backup]$ cat main.swift var rgb = [Double](repeating: 1, count: 3) let scalar: Double = 0.99 rgb.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } [araki@Arakis-MBP No Backup]$ swiftc -emit-assembly -O main.swift > main3.txt
Avatar
omochimetaru 24-Apr-19 02:23 AM
外側のループ回数の影響は受けないんかな それでも速度差一緒?
グローバル変数になってるのもアクセスに影響がある
Avatar
t.ae 24-Apr-19 02:24 AM
外にforつけてもdiffは同じですね
func内に全部おいたらかなり違った感じになりました。
[araki@Arakis-MBP No Backup]$ diff main3.txt main4.txt 20,23d19 < .section __TEXT,__literal8,8byte_literals < .p2align 3 < LCPI1_2: < .quad 4607092346807469998 43c39 < movl $3, %edi --- > movl $4, %edi 45c41 < movq $3, 16(%rax) --- > movq $4, 16(%rax) 48,49c44 < movabsq $4607182418800017408, %rcx < movq %rcx, 48(%rax) --- > movups %xmm0, 48(%rax) 85c80 < movl $3, %edi --- > movl $4, %edi 89,94c84,90 < movupd 32(%rdi), %xmm0 < mulpd LCPI1_1(%rip), %xmm0 < movupd %xmm0, 32(%rdi) < movsd 48(%rdi), %xmm0 < mulsd LCPI1_2(%rip), %xmm0 < movsd %xmm0, 48(%rdi) --- > movapd LCPI1_1(%rip), %xmm0 > movupd 32(%rdi), %xmm1 > movupd 48(%rdi), %xmm2 > mulpd %xmm0, %xmm1 > movupd %xmm1, 32(%rdi) > mulpd %xmm0, %xmm2 > movupd %xmm2, 48(%rdi)
Avatar
omochimetaru 24-Apr-19 02:26 AM
3個の場合に
ベクトル命令を発行するためにベクトルレジスタに出し入れするところが
アライメントがズレてて?余分な処理が生じる?
Avatar
t.ae 24-Apr-19 02:34 AM
XXXpdのほうがXXXsdより速いって感じですかね(よく分かってない) (edited)
Avatar
omochimetaru 24-Apr-19 02:35 AM
3.txtのほうだとxmm0しか使ってないけど4はxmm1とxmm2も使ってる?
Avatar
masakihori 24-Apr-19 03:49 AM
全体を見てみないとわからないけど、すごい最適化をしてる気がする
countプロパティって使われてます? 即値を使ってる気がする
Avatar
t.ae 24-Apr-19 03:56 AM
countはUnsafeMutableBufferPointerのを使ってますね。
Avatar
masakihori 24-Apr-19 03:58 AM
あれ? 0..<4 とかでコンパイルされてると思ったんだけど。
だとするとこの違いは何だろう
Avatar
t.ae 24-Apr-19 03:59 AM
上の方に貼ったのから殆ど変わってないですが
func test() { var rgb = [Double](repeating: 1, count: 4) let scalar: Double = 0.99 rgb.withUnsafeMutableBufferPointer { var p = $0.baseAddress! for _ in 0..<$0.count { p.pointee *= scalar p += 1 } } }
Avatar
masakihori 24-Apr-19 04:01 AM
あ! ソース上ではなく、アセンブリで、です。 $0.count を 4 としてコンパイルされている可能性が
Avatar
t.ae 24-Apr-19 04:05 AM
3.17 KB
3.07 KB
環境が違うかもしれないので全文アップロードしました。
Avatar
norio_nomura 24-Apr-19 05:24 AM
ループアンロールされてますね。 - 初期化: - main3: rgb[0...1]は128bitリテラル読み書き1回 rgb[2]は64bit即値書き込み1回 - main4: rgb[0...1] [2...3] 128bitリテラル読み込み1回書き込み2回 - 乗算: - main3: rgb[0...1] 128bit対象レジスタへ読み込み1回、128bitリテラルとレジスタの乗算1回、128bit書き込み1回 rgb[2] 64bit対象読レジスタへみ込み1回、64bit64bitリテラルとレジスタの乗算1回、64bit書き込み1回 - main4: rgb[0...1] [2...3] 128bitリテラルをレジスタへ読み込み1回、128bit対象をレジスタへ読み込み2回、128bitレジスタ同士の乗算2回、128bit書き込み2回 (edited)
Avatar
norio_nomura 24-Apr-19 05:33 AM
main3はリテラルの読み込みが1回多いのかな。
Avatar
omochimetaru 24-Apr-19 05:34 AM
すげえ。
Avatar
norio_nomura 24-Apr-19 05:38 AM
あと、main3は乗算の結果が2回ともxmm0に書き込まれるから順次実行、main4は乗算の結果を書き込む先がxmm1とxmm2別になってるから並列実行してそう。 (edited)
Avatar
omochimetaru 24-Apr-19 05:39 AM
main4の方は 128bit レジスタ同士の演算を2回にできるから scalar を1度読めば使い回せるけど、 main3の方は 128bit 同士と 64bit同士になる関係で、 scalar の読み込みが多くなっちゃう?
Avatar
norio_nomura 24-Apr-19 05:39 AM
そうなってますね。
Avatar
omochimetaru 24-Apr-19 05:40 AM
命令単位の並列性も関係するのか〜
Avatar
t.ae 24-Apr-19 05:43 AM
なるほど。そもそもループアンローリングされてることに気付かなくてどこがforだろうとか思ってました。
Avatar
norio_nomura 24-Apr-19 05:43 AM
要素数3と4は、一番速度差が出そうです。
Avatar
omochimetaru 24-Apr-19 05:43 AM
面白いなあ
Avatar
norio_nomura 24-Apr-19 05:45 AM
5と6、7と8と増えていくと、それぞれの前者も並列実行される割合が増えるし、全体に占めるリテラル読み込み時間は無視できる様になっていくと想像。
要素数がもっと増えると、より大きなレジスタを使う命令になって、そんな簡単にはいかなさそう。
Avatar
masakihori 24-Apr-19 05:57 AM
@norio_nomura やはりそうなってますよね
var rgb の要数が変わらない、$0.countがrgb.countと同一であることがコンパイラに伝えられてる
Avatar
kateinoigakukun 24-Apr-19 10:10 PM
swift5からJSONキーのキャメルケース変換がDictionaryに適用されなくなったんですがcorelib-foundationの方にそれが反映されてなくて挙動が乖離してた https://github.com/apple/swift-corelibs-foundation/pull/2161 (edited)
Using keyEncodingStrategy or keyDecodingStrategy, there is a difference of key name case between platforms. Darwin Linux Encode &quot;camelCase&quot; -&gt; &quot;camelCase&a...
それぞれの変更の同期漏れを防ぐような仕組み無さそうだし、こういう漏れは結構ありそう
Avatar
omochimetaru 25-Apr-19 03:17 AM
ありそう
Avatar
ikesyo 26-Apr-19 12:49 AM
Darwinでnestedな型になった文字列定数系がcorelibs-foundationではそのままとかよくあります
Avatar
koher 26-Apr-19 02:35 AM
async/await が導入されたら [weak self] やりたくなることが多そうだけどどうなるんだろう?↓とか?
func asyncFoo() async { weak var welf: ViewController? = self let isFinished = await UIView.animate(withDuration: 0.5, animations: { ... }) guard let self = welf else { return } ... }
guard let だと同一スコープで複数回同じ名前付けれないから、これまでネストしてた非同期処理で guard let self = を何度も書けなくて self のシャドーイングに落ち着いた名前問題が再燃する? (edited)
await 後は(同一スコープなのに)いきなり明示的 self. が必要になったり、色々変な感じになることがありそう・・・。 (edited)
Avatar
omochimetaru 26-Apr-19 05:04 AM
awaitより後ろは暗黙のselfキャプチャーで良いのではないかと思ってます
コルーチンが終了すれば解放されるのでリークはしないし。
Avatar
koher 26-Apr-19 05:19 AM
そうか。普通の非同期処理だとリークしないからいいか。
Avatar
tarunon 26-Apr-19 05:20 AM
暗黙strong selfどうにかして破壊できないかな
defer組み合わせて壊せないだろうか
Avatar
omochimetaru 26-Apr-19 05:22 AM
通常のクロージャだと明示だよね、inner func だと暗黙
Avatar
koher 26-Apr-19 05:22 AM
async なクロージャと組み合わせられるとまずそう?
class C { let foo: () async -> Void = { [weak self] in guard let self = self else { return } await bar() baz(self) } }
(edited)
Avatar
tarunon 26-Apr-19 05:24 AM
inner func暗黙、マジで壊れるんで危ない
inner computed varも壊れやすい
Avatar
koher 26-Apr-19 05:26 AM
まずくないか
クロージャ保持する時点で [weak self] 挟むから大丈夫か (edited)
↓とかクロージャ終了しないけど、単純な非同期処理じゃなくて、こういう使い方でリークしてしまうこととかないかな?
let fibs = Generator { yield in var (a, b) = (0, 1) while true { await yield(a) (a, b) = (b, a + b) } }
Avatar
omochimetaru 26-Apr-19 05:35 AM
それはありえますね。まあ、同期だったらと考えると、永遠に脱出しない関数なので、それで当然という感じもします
func actInf() { while true { sendMessage() } }
↑もしこれを(別スレッドなどで)呼び出したらselfは永遠に解放されない
Avatar
omochimetaru 13-May-19 04:03 AM
SwiftでDiscord Botつくるとして、 2つライブラリがあるっぽいんですが、どっちが良いとか知見ある人います? https://github.com/nuclearace/SwiftDiscord https://github.com/Azoy/Sword とくに @norio_nomura @Kishikawa Katsumi
Discord API Client for Swift. Contribute to nuclearace/SwiftDiscord development by creating an account on GitHub.
Discord library for Swift. Contribute to Azoy/Sword development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 13-May-19 04:07 AM
私はNodeで書いてるのでわからないです。一般的な観点だと、DiscordのAPIはそんなに機能がたくさんあるわけでもないから、機能の未サポートとかで苦労することはあまりなさそうなので、使いやすそうなものを選んだらいいのでは、という気がします。
Avatar
omochimetaru 13-May-19 04:08 AM
ふむふむ。
Avatar
norio_nomura 13-May-19 04:09 AM
僕はSwordの古いバージョンをカスタマイズして使ってる。
Avatar
omochimetaru 13-May-19 04:09 AM
Swordを選んだ理由はなんかありますか?あと最新じゃないのも気になるw
Avatar
norio_nomura 13-May-19 04:11 AM
以前は各バージョンのSwiftそれぞれでビルドしていたため、複数バージョンのSwiftでビルド出来る必要があり、Swift 4.0でもビルドできるモノを元に独自バグフィクスしたものになっています。>最新じゃない。 (edited)
Swordを選んだのはクロージャでイベントを取れたから。SwiftDiscordはdelegateじゃなかったかな?
Avatar
omochimetaru 13-May-19 04:18 AM
なるほどなるほど。クロージャとデリゲートの違いは個人的にはでかいですね、そのあたりのAPIを見比べて見ようと思います。 ふたりともありがとうございます。
Avatar
norio_nomura 13-May-19 04:20 AM
あいや、クロージャでイベントを取れたことより、ビルド出来るSwiftのバージョンの方が決め手だったかも?定かではないですが。
Swordは僕が使ってるものからメジャーバージョンが上がって、少し変わったのかも。
ボットアプリをビルドするSwiftのバージョンを固定する様に変えたので、今だと違うものを選ぶかも。 (edited)
Avatar
omochimetaru 13-May-19 04:22 AM
ふむふむ。
Avatar
norio_nomura 13-May-19 04:26 AM
受け取るDiscordのイベント定義をもっと柔軟に出来るものを、Swift-NIOで自分用に書こうとして未完。
Avatar
norio_nomura 13-May-19 04:39 AM
以前は、SwordもSwiftDiscordも外部依存するパッケージに加え更にSodiumとか外部ライブラリが必要だったけど、Swordはその辺り不要になったぽい。
今選んでも「Swordをカスタマイズ」かな。
テストがちゃんと書かれてたらPRも書くのだけど。>Sword
Avatar
omochimetaru 13-May-19 04:54 AM
なるほど、ありがとうございます。
Avatar
omochimetaru 14-May-19 05:14 PM
Swordがswift-nioベースで作り直している途中の状態だったので、未実装部分を書き足して動かしてみたところ、 Discord公式のドキュメントの記述と実際に送られてくるバイナリに不一致があって困った。 API開発者サーバにswift-swordチャンネルがあってAzoyさんも居たので、詳細はそこに書いてきた。 https://discordapp.com/developers/docs/intro#getting-help
Integrate your service with Discord — whether it's a bot or a game or your whatever you wildest imagination can come up with.
具体的には、transport compression modeにおいてはバイナリを結合して Z_SYNC_FLUSH = 00 00 FF FF でスプリットしろと書いてあるがこの4バイトが見当たらない。
Avatar
norio_nomura 14-May-19 11:02 PM
途中なのか。
Avatar
omochimetaru 15-May-19 12:47 AM
めちゃくちゃ途中で、SwordはTLSの設定してないからwss動かないので全く動かないし nio-websocketはバイナリフレームの処理が書いてない
普通に作業中にコミットしたそのまんまって感じ まあ自分もよくやる
Avatar
norio_nomura 15-May-19 04:06 AM
そうか、書き換え終わってなかったのか。
vaporのWebSocket実装は気に入らなかったから、その辺りも含めて途中まで自分で実装したやつを再開しようかな。
Avatar
norio_nomura 15-May-19 04:25 AM
あとTransport Compressionは、ここで僕が動かしてるボットで使ってるSwordはサポートしていなかったはず。 (edited)
Avatar
omochimetaru 15-May-19 04:33 AM
ああ、接続時にそれを有効にするコードが、最新の作りかけコミットで導入されていたので、タイミング的にそうですね
その辺を外せば動かすことはできそうなんですが、
そういうのは悔しいから動かそうとしてます
Avatar
omochimetaru 15-May-19 02:07 PM
Swordのswift-nio実装が結構壊れている
WebSocket接続のネゴシエーションって、HTTPRequest/Responseの形で行われるが、
サーバがHTTPResponseを返して、それ以降のストリームはWebSocketストリームなんだけど、
HTTPResponseを受け取ってから、 WebSocketClientUpgradeHandlerをチャンネルハンドラから取り除いて、 新しくWebSocketHandlerを取り付ける、って処理が、
nio/EventLoopFutureの非同期処理チェーンで実装されていて、
ハンドラのつけ外しが完了する前に、サーバからWebSocketストリームがもう届いてしまっていて、
タイミングが間に合ってなくてWebSocketストリームを喪失してしまう。
Avatar
omochimetaru 15-May-19 02:44 PM
非同期なのは関係なかったけど問題はあってた。
Swordじゃなくてvapor/nio-websocket-clientのバグだ。
😩 1
Avatar
norio_nomura 15-May-19 11:37 PM
以前VaporのhttpクライアントがTLSのチェックを無効にしてるのを見かけてから、Vaporは避ける様にしてる。
Avatar
omochimetaru 16-May-19 02:22 AM
それはひどいですね
Avatar
el_metal 16-May-19 03:08 AM
TLSチェック無効は厳しい…
Avatar
norio_nomura 16-May-19 03:55 AM
* enable cert validation by default * add new HTTPScheme.customHTTPS option
Avatar
norio_nomura 16-May-19 02:03 PM
以前途中まで書いたDiscordクライアント用ライブラリをSwiftNIO 2.0へ移行してて思い出したけど、自分でHTTP, WebSocketクライアントまで書こうとした理由はPROXYサポートを追加したかったからだった。
Avatar
omochimetaru 16-May-19 02:05 PM
なるほど。
その後、下記2件はまとまりました。 vaporのWebSocketClientのバグ修正 https://github.com/vapor/nio-websocket-client/pull/4 Swordの未実装作業の完了 https://github.com/Azoy/Sword/pull/56
I retry #3 This PR resolves #1. Original implementation have this steps. add out WebSocketFrameEncoder add in WebSocketFrameDecoder remove inout WebSocketClientUpgradeHandler upgradePipelineHandler...
I implemented transport compression. I keep code difference small as much as I can. I split changes to some commits so that it is easy to review. I explain detail. 0206648: Change nio-websocket-cl...
Avatar
norio_nomura 16-May-19 02:13 PM
VaporのWebSocketClientWebSocketClientUpgradeHandler receivedContentschannelReadで受け取ったデータを溜め込む実装は筋が悪いと思うんだよね。 (edited)
Avatar
norio_nomura 16-May-19 02:20 PM
手元の実装では、WebSocketClientUpgradeHandlerchannelActiveは下流へchannelActiveを発火せず、channelRead.switchingProtocolsを受け取ったら自身をハンドラから削除してから下流へchannelActiveを発火することで、意図しないchannelReadが発生しない様にしてる。 (edited)
Avatar
omochimetaru 16-May-19 02:29 PM
その作り気持ち悪いですよね。 設計としては swift-nio の HTTPServerUpgradeHandlerを参考にしてます。
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - apple/swift-nio
これは NIOWebSocketServerUpgrader で使われてます。
swift-nioの仕組みを詳しく知らないんですけど、後段がactiveではない場合、送り出したchannelReadがパイプライン中で詰まって?止まってくれるんですか?
Avatar
norio_nomura 16-May-19 02:39 PM
channelActiveを受け取らない限りreadwriteも起きないと思います。
あ、WebSocketClientUpgradeHandler channelReadfireChannelReadを呼ばない前提です。
正確には「channelActive, channelReadを次のハンドラへ流さないことで、次のハンドラからのwriteを抑制して予期しないchannelReadを発生させない」ですね。 (edited)
Avatar
omochimetaru 16-May-19 02:50 PM
ああそうか、アップグレードが終わるまではUpgradeHandlerで処理が終端してる状態で、終わった瞬間に自殺すれば、タイミング的に綺麗にいきますね
Avatar
norio_nomura 16-May-19 02:51 PM
そう。
Avatar
omochimetaru 16-May-19 02:51 PM
考えてみたらSSLネゴシエーションと同じか
nioのサーバーがそうなってないのは、普段はHTTPサーバーとしてコンテンツを応答していて、リクエストを見てwebsocketにアップグレードするからかな?
Avatar
norio_nomura 16-May-19 02:52 PM
SSLは暗号化復号化が常に入るから残る必要があるけど、WebSocketは残る必要がない。
Avatar
omochimetaru 16-May-19 02:52 PM
なんか同じようにできそうな気もするけど・・・
そか、残るかどうかは違いますね
Avatar
norio_nomura 16-May-19 02:53 PM
サーバーもコネクション毎にインスタンスが起きるんじゃないのかな。
Avatar
omochimetaru 16-May-19 02:56 PM
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - apple/swift-nio
この部分のことです
上流(HTTPRequestDecoder)がアップグレードリクエストをUpgraderに渡した時点で、 すでに受信して上流がバッファしてしまっているWebSocketストリームを、 上流を外すとともにUpgraderが受け取り、 下流のWebSocketFrameDecoderがくっついてから、 受け取った分を下流に流してから、Upgrader自身が消える
Avatar
norio_nomura 16-May-19 02:58 PM
ああ、そういうことか。
サーバーの場合、応答する前にリクエストが来るからだね。 (edited)
keep alive
Avatar
omochimetaru 16-May-19 02:59 PM
今の話だと、 Upgraderがアップグレードリクエストを受け取ったタイミングで、 WebSocketFrameDecoderをUpgradeの下流に設置しつつ、 Upgraderを削除してから、上流(HTTPRequestdecoder)を削除したら、 上流がバッファしてたbytesがいきなりWebSocketFrameDecoderに流せないかしら
Avatar
yoshiki 19-May-19 08:31 AM
ゲームアプリを公開しました! https://itunes.apple.com/jp/app/kururi/id1463318296?mt=8
‎ステージが回転する落ちものパズルゲームです。 3つ同じ色のブロックを揃えると消えるというシンプルなルールです。 ステージ回転を駆使してブロック削除の連鎖を目指しましょう! It is a puzzle game ...
Avatar
t.ae 23-May-19 10:19 AM
func median<T: Comparable>(bp: UnsafeMutableBufferPointer<T>) -> T { // error: cannot use mutating member on immutable value: 'bp' is a 'let' constant bp.sort() return bp[bp.count / 2] }
これってMutableCollectionの定義に従うためだけにmutatingなんですかね🤔
プロトコルの宣言がmutatingだけど実装はmutatingじゃなくていい場合はthrowsと違って考慮されていない気がします。 まぁそもそもそんなケースがたくさんありそうもないですが。
Avatar
omochimetaru 23-May-19 12:24 PM
そのケースの場合は一度varにコピーすれば良い?
mutatingでなくて良いなら、noutatingなsortをその型に対して生やせそう
Avatar
koher 23-May-19 12:33 PM
生やせそうだけど、 struct である UnsafeMutableBufferPointernonmutating func で状態が変更されるってカオスな気も。
と、思ったけど、 subscript はすでにそうだった。
Avatar
omochimetaru 23-May-19 12:34 PM
型名のMutableはメモリのミュータビリティで
メソッドのmutatingはポインタと長さのそれ自体のミュータビリティだから
Avatar
koher 23-May-19 12:35 PM
いやもちろんそうなんだけど。
Avatar
omochimetaru 23-May-19 12:35 PM
良さそう
Avatar
koher 23-May-19 12:36 PM
nonmutatimg func でオーバーライドができればいいのかな?
オーバーライドというか、実装。
Avatar
omochimetaru 23-May-19 12:37 PM
オーバーロードかな?
protocolのconform?
Avatar
koher 23-May-19 12:37 PM
うん、conform (edited)
Avatar
omochimetaru 23-May-19 12:38 PM
MutableCollectionのprotocol extからやってくるmutating版を無効にして
自前で定義したnonmutating版が生えるのが良いのかな
Avatar
koher 23-May-19 12:42 PM
@swift-5.0.3
protocol P { mutating func foo() } extension P { mutating func foo() { print("P") } } struct S: P { func foo() { print("S") } } let s: S = S() s.foo() // ↓エラー // let p: P = s // p.foo() var p: P = s p.foo()
Avatar
swift50 BOT 23-May-19 12:42 PM
S S
Avatar
omochimetaru 23-May-19 12:43 PM
むむ?
そうなってる?
Avatar
koher 23-May-19 12:43 PM
MutableCollectionのprotocol extからやってくるmutating版を無効にして 自前で定義したnonmutating版が生えるのが良いのかな
それでよさそう。 nonmutatingsort 実装できそうだね。
↑ができるということは単に実装がサボられてる?
Avatar
omochimetaru 23-May-19 12:43 PM
これcontributeしたほうがいいな
Avatar
koher 23-May-19 12:43 PM
contribute というか
API の変更だから (edited)
他のも洗い出して Proposal ?
どっちで対応するか確認するためにも、 evolution に投げた方が良さそう?
Avatar
omochimetaru 23-May-19 12:44 PM
muttatingは全部やらないとw
Avatar
koher 23-May-19 12:45 PM
ポインタ系以外で似たようなものってないかな?
標準ライブラリじゃないけど、 NSMutableArray とかもなってるかも?
Sequence だけど MutableCollection じゃないのか。 > NSMutableArray
Avatar
omochimetaru 23-May-19 12:46 PM
そうなのか。
Avatar
koher 23-May-19 12:47 PM
まあとりあえず対応範囲は標準ライブラリでいいとして、ポインタ以外はないかな?普通に考えたらなさそうだけど・・・。
- UnsafeMutableAudioBufferListPointer - UnsafeMutableBufferPointer - UnsafeMutableRawBufferPointer
Avatar
omochimetaru 23-May-19 12:48 PM
参照的に振る舞うコレクションは標準にはない気がする
Avatar
Avatar
omochimetaru 23-May-19 12:49 PM
なるほどwおもしろい。
Avatar
koher 23-May-19 12:50 PM
↓の subscript setnonmutating であるべきかは判断が難しい・・・。 https://developer.apple.com/documentation/swift/emptycollection/1541374-subscript
Avatar
omochimetaru 23-May-19 12:51 PM
空のsubscript setもnonmutだと思うなぁ
1個だからw
Avatar
koher 23-May-19 12:52 PM
CollectionOfOne については、 sortnonmutating にできるけど、 subscript set はできないね。
Avatar
omochimetaru 23-May-19 12:52 PM
そうですね
型の特性によって変わるの面白い
Avatar
koher 23-May-19 12:53 PM
ちょっと CollectionOfOne は微妙だし、 EmptyCollection も意見が分かれるかもだけど、ポインタ系はやるべきな気がするね。 subscript setnonmutating なわけだし。
MutableCollection 以外で Mutable*nonmutating できそうなものとかあるかなぁ。
Avatar
omochimetaru 23-May-19 12:54 PM
ああーそうか、他にもあり得るか
この辺のMutablrCollectionのさらにサブプロトコルで
mutating funcがいますね
Avatar
koher 23-May-19 01:00 PM
RangeReplaceableCollection 見てたけど、 append とかはできないよね。
Avatar
Avatar
koher 23-May-19 01:00 PM
count を書き換えないといけないから。
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 23-May-19 01:01 PM
お。バッファポインタについてはそうですね。
Avatar
koher 23-May-19 01:01 PM
バッファポインタってそもそも append 生えてないのか。
let count だけど、一応 self 書き換えはできるだろうけど。
最初にでかい領域を確保しておいて、その一部をバッファポインタに割り当てて append とかもない? (edited)
Avatar
omochimetaru 23-May-19 01:03 PM
なさそう、そういうのを作るためのプリミティブな道具だと思ってた
Avatar
koher 23-May-19 01:04 PM
UnsafeMutableAudioBufferListPointer って初めて見た。
ああ
標準ライブラリじゃないのか
Core Audio に飛んでた・・・
ってことは↓だけでいいのかな? - UnsafeMutableBufferPointer - UnsafeMutableRawBufferPointer
PR 作った上で、 pitch として evolution に投げてみても良さそう。
Avatar
omochimetaru 23-May-19 01:07 PM
ですね
Avatar
koher 23-May-19 01:08 PM
今やる時間ないので @omochimetaru に任せます。
Avatar
omochimetaru 23-May-19 01:09 PM
暇な時に・・・😑
Avatar
koher 23-May-19 01:10 PM
特にやりたいわけでなければ、こちらで暇なときにでも投げてみます🙂
Avatar
t.ae 24-May-19 12:35 AM
一晩見てないうちに大量に……(最近iphoneの方に通知が来ない気がする)
mutatingな宣言をnonmutatingで実装するの自体はできるんですね。調べてなかったです。 (edited)
Avatar
tarunon 24-May-19 12:39 AM
nonmutatingをmutatingで実装はぶっ壊れますが逆は問題無さそう
Avatar
t.ae 24-May-19 12:39 AM
protocol P { mutating func foo() } extension Array: P { func foo() { } } var a = [0, 1, 2] var p: P = a p.foo()
こういう形のときCoWがどうなるんだろうとか思ったり。
Avatar
tarunon 24-May-19 12:40 AM
CoWは実際にバッファ操作されてからかな?と考えてましたがどうでしょうか
Avatar
t.ae 24-May-19 12:41 AM
今同じこと思いついてました。mutatingであるかどうかだけでCoWが働く必要はないですね。
Avatar
tarunon 24-May-19 12:42 AM
mutatingの宣言はlet宣言を禁止するためのものなので、その先で何が起こるか、は問題では無いと思いました。極端な話、mutatingで実装してnonmutatingをコールしても良いのでは
(オーバーロードできるなら).
Avatar
t.ae 24-May-19 12:52 AM
別件ですけどこれもmutatingである必要が無いですよね。
func test1(bp: UnsafeMutableBufferPointer<Double>) { bp[0] = 0 } func test2(slice: Slice<UnsafeMutableBufferPointer<Double>>) { slice[0] = 0 // error: cannot assign through subscript: 'bp' is a 'let' constant }
こっちは対処するのめんどくさそうですが……
Avatar
omochimetaru 24-May-19 12:59 AM
極端な話、mutatingで実装してnonmutatingをコールしても良いのでは
呼び出しの時のselfの型が違うのでそれはできない computed propertyへの書き戻しがされないなどのバグが起きるはず
Avatar
tarunon 24-May-19 12:59 AM
多分逆な気が
表現が良くなかったな
Avatar
t.ae 24-May-19 01:00 AM
そもそも分岐しないので書き戻しの必要がないってことですよね。
Avatar
tarunon 24-May-19 01:00 AM
func f() { ここに実装があるよ } mutating func f() { f() } // プロトコルへのconformだよ
これが出来れば丸く解決する
(edited)
Avatar
t.ae 24-May-19 01:01 AM
ああ、そういう。
Avatar
omochimetaru 24-May-19 01:01 AM
そっちはオーケー
Avatar
tarunon 24-May-19 01:01 AM
宣言無しでもそういう動きなら良い
Avatar
omochimetaru 24-May-19 01:02 AM
nonmutatingの方だけ実装すればprotocol conformになる
mutatingなやつが内部的に作られてPWTにいれられてると思う
Avatar
tarunon 24-May-19 01:03 AM
つまり今回のはfuncの宣言に余計なmutatingが張り付いてるね、という話なのね
Avatar
omochimetaru 24-May-19 01:04 AM
いや、宣言があるのはMutatingCollectionのprotocol extensionだから、それ自体は余計ではない
nonmutatingな実装を一部の型は自前で定義をもたないといけないって話
Avatar
tarunon 24-May-19 01:04 AM
もう一回読み直そう
Avatar
omochimetaru 24-May-19 01:05 AM
余計なものがあるんじゃなくて最適なものがまだないので不便、というむき
Avatar
t.ae 24-May-19 01:33 AM
https://forums.swift.org/t/why-does-the-withunsafemutablebufferpointer-closure-take-an-inout-parameter/6794/11 フォーラム検索したら似たような指摘がありました。
A lot of the MutableCollection implementation is in protocol extensions (swapAt, for example.) Should an additional version be written just for the Unsafe*BufferPointer types? Makes sense to me, given the examples above. It doesn’t seem to be a high priority task though, ...
As far as I can see, MutableCollection defines four mutating methods: swapAt(), sort(), reverse(), and partition(). Implementing those as non-mutating methods of UnsafeMutableBufferPointer seems natural to me.
Avatar
omochimetaru 24-May-19 01:36 AM
glessardさんがコメントしてるけど今回のとはズレてるな
Avatar
koher 24-May-19 02:33 AM
なんかこの inout の話、前に話したことあるよね。 withUnsafeMutableBufferPointer inout は過剰だけど、現状表現できるものが inout しかないって。
Avatar
omochimetaru 24-May-19 02:34 AM
記憶なし
Avatar
koher 24-May-19 02:34 AM
でももしかしてバッファポインタ側が nonmutating で実装されれば問題ない?
https://discordapp.com/channels/291054398077927425/306995750418513920/422937036870385684 ↑これっぽい。前に話したの。 Discord の検索優秀。 (edited)
Avatar
t.ae 24-May-19 02:35 AM
BP自体を変更したいことがあるかどうかですね。というかそういう内容が↑に貼ったフォーラムの本題だと思われます。
Avatar
omochimetaru 24-May-19 02:38 AM
うおーなつかしい
なるほどおまけでescapeをブロックしているのか偉い
Avatar
koher 24-May-19 02:38 AM
@t.ae 「BP自体を」ってのは self 書き換えならぬ inout で渡されたもの自体を書き換えることを言ってる?↓みたいな感じで。
array.withUnsafeMutableBufferPointer { p in p = q }
Avatar
omochimetaru 24-May-19 02:39 AM
このときの会話のログだと、inoutになってるのは単に歴史的経緯って感じじゃないですか?
Avatar
koher 24-May-19 02:39 AM
Array.withUnsafeMutableBufferPointerがbodyにinout UnsafeMutableBufferPointerを渡すんだけ inoutを用いて書き換わってるとエラーになる。
(edited)
Avatar
omochimetaru 24-May-19 02:40 AM
書き換えを実行時に咎めるならletで渡して欲しいね
Avatar
koher 24-May-19 02:42 AM
@escaping にキャプチャされることを防ぐためには inout が必要だけど、ポインタ自体の書き換えは封じられてるから、 inout のそれ自体を書き換えられる機能は要らないという理解。
Avatar
omochimetaru 24-May-19 02:44 AM
@escaping にキャプチャされることを防ぐためには inout が必要
これは「たまたまそういう恩恵が得られた」わけじゃなくて、そのためなんですか?
キャプチャされることを防いだところで、 return bp しちゃえば取り出せるからあんまり意味ないと思う
Avatar
koher 24-May-19 02:46 AM
たまたまかもしれないけど、意図的に取り出す return bp と意図せずやってしまうキャプチャとでは、後者だけ防げるのは意味がある気がする。
歴史的経緯だけなら、ポインタ書き換えを防ぐ処理を入れるくらいだったら、その時点で inout を外すことを検討しても良さそうな気も。
Avatar
omochimetaru 24-May-19 02:48 AM
ふ〜む
Avatar
koher 24-May-19 02:50 AM
このスレッド、元の話はともかく、↓とかは同じことを話してるよね?
The issue with changing .swapTo (et al.?) to nonmutating is that semantically it really is a mutation. But pointers as collections have different mutation semantics to other collections: Mutating an Array’s storage is the same as mutating its value, whereas a pointer’s value is its address, not its storage. Making the Unsafe*Pointer MutableCollection methods themselves nonmutating probably wouldn’t be a source-breaking change (it’d just lower the “bar of entry” to include let constant instances too). I imagine this is noncontroversial.
https://forums.swift.org/t/why-does-the-withunsafemutablebufferpointer-closure-take-an-inout-parameter/6794/10
(edited)
A lot of the MutableCollection implementation is in protocol extensions (swapAt, for example.) Should an additional version be written just for the Unsafe*BufferPointer types? Makes sense to me, given the examples above. It doesn’t seem to be a high priority task thou...
Avatar
omochimetaru 24-May-19 02:51 AM
But pointers as collections have
different mutation semantics to other collections まさにまさに
Avatar
koher 24-May-19 02:52 AM
ポインタ書き換えの話もしてるけど、 @escaping キャプチャ防止の話はされてなさそう?
Avatar
t.ae 24-May-19 03:03 AM
Currently this code is not compilable. func median(bp: UnsafeMutableBufferPointer) { bp.sort() // error: cannot use mutating member on immutable value: 'bp' is a 'let' constant return bp[bp.count/2] } It is because sort, defined in MutableColelction, is mutating. U...
👍 1
Avatar
koher 24-May-19 03:06 AM
@t.ae オーバーロードじゃないんじゃない? (edited)
Avatar
omochimetaru 24-May-19 03:07 AM
たしかに。
Avatar
t.ae 24-May-19 03:07 AM
デフォルト実装があるんでオーバーロードかと思いますけど 言葉に自信がないですね・・・
Avatar
omochimetaru 24-May-19 03:07 AM
デフォルト実装は消えるよ
PWTにはデフォルトか固有のどっちかしか入らない
もちろんstaticにMutableCollectionとしてみなしたときは呼び出せる。
Avatar
t.ae 24-May-19 03:08 AM
あー両方残るわけじゃないのか。
じゃあなんていうんでしょう?overwritten?
Avatar
omochimetaru 24-May-19 03:08 AM
conform to protocol requirement method by nonmutating one for it だと思う (edited)
Avatar
t.ae 24-May-19 03:09 AM
実はsortはprotocol requirementじゃないという
Avatar
omochimetaru 24-May-19 03:09 AM
overrideでもoverloadでも無いと思う
あ〜
Avatar
t.ae 24-May-19 03:10 AM
partitionとかはそうなんですがsortはただのprotocol extension
Avatar
omochimetaru 24-May-19 03:10 AM
そうするとそれはoverloadになりそう。
overloadされた上でnonmutating優先での探索になるんじゃないか
Avatar
t.ae 24-May-19 03:11 AM
文章的には……overload or ~って書くと長いしoverloadだけで伝わりそうなのでそのままにしときます。
nonmutating優先というかBPに実装されるのでより狭い型のほうを取ることになるはずですね。 (edited)
Avatar
omochimetaru 24-May-19 03:12 AM
ああ、生えてる場所が自分だからの優先か
Avatar
koher 24-May-19 03:13 AM
@swift-5.0.3
protocol P { // mutating func foo() } extension P { mutating func foo() { print("P") } } struct S: P { func foo() { print("S") } } let s: S = S() s.foo() // "S" var s2: S = S() s2.foo() // "S" var p: P = s p.foo() // "S"
Avatar
swift50 BOT 24-May-19 03:13 AM
S S P
Avatar
koher 24-May-19 03:14 AM
@swift-5.0.3
protocol P { // mutating func foo() } extension P { mutating func foo() { print("P") } } struct S: P { func foo() { print("S") } mutating func foo() { print("S2") } } let s: S = S() s.foo() // "S" var s2: S = S() s2.foo() // "S" var p: P = s p.foo() // "S"
(edited)
Avatar
swift50 BOT 24-May-19 03:14 AM
exit status: 1 with stderr:
<stdin>:15:19: error: invalid redeclaration of 'foo()' mutating func foo() { ^ <stdin>:12:10: note: 'foo()' previously declared here func foo() { ^
(edited)
Avatar
koher 24-May-19 03:16 AM
オーバーロードというのもミスリードしそうな気も?
オーバーロードはオーバーロードだけどシャドーイングされてて S のままでは呼び出せないし。
sortMutableCollection にないのは、 ElementComparable じゃないといけないからか。
Avatar
t.ae 24-May-19 03:20 AM
shadowがどちらの場合も表せて良さそうなので使います。
Avatar
koher 24-May-19 03:21 AM
Implement とかでいいんじゃないかな? conform のときはシャドーイングじゃないし。
Implement buffer pointer’s MutableCollection methods as nonmutating
とかだと、都合よく conform なのか overload/shadow なのか解釈してくれそうな気が
Avatar
t.ae 24-May-19 03:22 AM
メソッドをimplementするとプロトコルをimplementするのダブルミーニングですねw
🙂 1
Avatar
t.ae 24-May-19 06:11 AM
@swift-5.0.3 -O
import Foundation func time(label: String, f: ()->Void) { let start = Date() f() print("\(label): elapsed time: ", Date().timeIntervalSince(start), "sec") } var x = [Int](0..<65536) x.withUnsafeMutableBufferPointer { bp in time(label: "Slice") { bp[0..<60000].sort() } time(label: "Rebase") { var rebase = UnsafeMutableBufferPointer(rebasing: bp[0..<60000]) rebase.sort() } }
(edited)
Avatar
swift50 BOT 24-May-19 06:11 AM
exit status: 11 with stderr:
Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret - -disable-objc-interop -I /Libraries/.build/x86_64-unknown-linux/debug -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/CSwiftBacktrace/include -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/Clibunwind/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOHTTPParser/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOSHA1/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOAtomics/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIODarwin/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOLinux/include -module-cache-path /Libraries/.build/x86_64-unknown-linux/debug/ModuleCache -O -D DEBUG -Xcc -fmodule-map-file=/Libraries/.build/checkouts/SwiftBacktrace/Sources/CSwiftBacktrace/include/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/checkouts/SwiftBacktrace/Sources/Clibunwind/include/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOHTTPParser.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOSHA1.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOAtomics.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIODarwin.build/module.modulemap -Xcc -fmodule-map-file=/Libraries/.build/x86_64-unknown-linux/debug/CNIOLinux.build/module.modulemap -module-name main -lLibraries /usr/bin/swift[0x4626bd4] /usr/bin/swift[0x46249a0] /usr/bin/swift[0x4626d82] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7fbbc7af7390] [0x7fbbc7f25d22] [0x7fbbc7f25837] [0x7fbbc7f24e3b] [0x7fbbc7f24d08] [0x7fbbc7f24af7] [0x7fbbc7f24862] [0x7fbbc7f242d3] /usr/bin/swift[0xcf1a7e] /usr/bin/swift[0xcf5c92] /usr/bin/swift[0x5162df] /usr/bin/swift[0x4eb215] /usr/bin/swift[0x4e66b6] /usr/bin/swift[0x48da2e] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fbbc
(edited)
Avatar
t.ae 24-May-19 06:11 AM
Sliceのソートが遅い
Avatar
omochimetaru 24-May-19 06:12 AM
Releaseビルド? (edited)
Avatar
t.ae 24-May-19 06:12 AM
あーそれもあるな。オプションなんでしたっけ?
Avatar
omochimetaru 24-May-19 06:12 AM
-O
Avatar
t.ae 24-May-19 06:12 AM
一応time profilerでも遅いことは確認してます。
Avatar
omochimetaru 24-May-19 06:12 AM
Sliceはジェネリック型だから
Specializeされないと遅いはず
Avatar
koher 30-May-19 07:17 AM
string1 += string2 はちゃんと string1 = string1 + string2 よりも効率的に実装されてるのか。 https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift#L575-L577
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
他の += もかな。
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
t.ae 30-May-19 07:19 AM
https://github.com/apple/swift/blob/master/stdlib/public/core/Array.swift#L1323-L1327 +がappendで実装されてるのか…… 最適化でどうなってるかわからないですがuninitialized initializer使ったほうが速そう。
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
koher 30-May-19 07:21 AM
CoW のアロケートは効率的に実装されてるんじゃないかな?
Avatar
t.ae 30-May-19 07:21 AM
CoWというかappendで拡大する場合のほうですね。
Avatar
koher 30-May-19 07:22 AM
ああ、最初から結合後の capacity を持っておいたいいってことか。
Avatar
kenmaz 30-May-19 11:42 AM
会社の開発合宿でVC間の関連を図示するツールの開発をSwiftSyntaxを使って試みたんですが、どうしてもアプリごとの設計によってうまく図示できなかったりしまして (edited)
汎用的なツールをめざすなら、完全なコールグラフが必要かと思うんですが、どういう手法がありますかね? (edited)
Avatar
t.ae 12-Jun-19 08:06 AM
CarthageのためにSwiftPMプロジェクトにxcodeprojコミットすること割とあったんですけどXcode11のSPM対応のおかげでxcodeproj不要になりましたね。 CarthageのSPM対応PRは二年前からオープンだけどいつマージされるんだろうか……
Avatar
omochimetaru 12-Jun-19 08:07 AM
まだ、リソースがある場合とかは、必要な気がする
Avatar
t.ae 12-Jun-19 08:08 AM
その場合は確かに。
Avatar
t.ae 13-Jun-19 12:43 AM
swiftのUnsafe〜のネーミングってルール特に無いですよね? Unsafe*Pointerをラップした型があって、それにUnsafeプレフィックスが必要かどうか迷ってるんですが。 更にいうとwithUnsafePointerとかはunsafeが自然に付いてるのでいいんですが、同様の引数でsomeFuncというのを作りたい場合それはunsafeSomeFuncにすべきかとか……
Avatar
omochimetaru 13-Jun-19 01:49 AM
Unsafeはコンパイラが未定義動作を起こしうるときについてる気がする
型名についてればその型を使うほとんどが危険で
メソッド名の場合はそれを使うときだけ危険
クラッシュしうるけど未定義ではない(チェックによる確実な自殺がある)ケースは
Swiftではunsafeとは呼ばれてない
Avatar
t.ae 13-Jun-19 01:50 AM
>クラッシュしうるけど未定義ではない(チェックによる確実な自殺がある)ケースはSwiftではunsafeとは呼ばれてない これは確かに……
Avatar
omochimetaru 13-Jun-19 01:51 AM
ロジックによって死ぬ限りはsafe (edited)
例えばunsafeBitCastとかも
本当にキャストしてよかったのかどうか一切検査されない
逆にas!によるキャストは真の型を実際に検証する。 (edited)
Avatar
t.ae 13-Jun-19 01:53 AM
新しいケースだと5.1のuninitialized initializerはラベルにunsafeついてるんですよね public init(unsafeUninitializedCapacity:,initializingWith initializer:) これinit+末尾クロージャのみのケースではだったらどうするんだろう……
Avatar
omochimetaru 13-Jun-19 01:54 AM
クロージャ名のラベルにunsafeが含まれるんじゃない?
trailing記法は死んじゃうけどまあ仕方ない
static methodにするっていう意地を張る事はできるかもしれん
Avatar
t.ae 13-Jun-19 01:56 AM
これが進んだらinitializerもunsafeかけるようになって https://forums.swift.org/t/unsafe-functions/20137
Following the discussion about pointer type sugar (Int* which would be sugar for UnsafePointer etc. here: Swift Pointer Syntatic Sugar), Slava mentioned "unsafe" blocks + function annotation where such sugar could be utilized. This is a feature that is found in languages like...
良いかもしれない。
Avatar
omochimetaru 13-Jun-19 01:57 AM
またAzoy氏だ
unsafe contextの静的検証か〜
これやるなら
do-catch try みたいに
文単位markingの仕様じゃないと
どこがunsafeXxxなのかわからなくて中途半端になりそうだね
C#とRustはそうだったっけ?
Avatar
t.ae 13-Jun-19 01:59 AM
というのを僕が書いたら返信がないまま止まってます
Avatar
omochimetaru 13-Jun-19 02:01 AM
Discussion止まっても進めたければproposal書いてpitch投稿するしかないんだろーなー
Avatar
t.ae 13-Jun-19 02:02 AM
特に需要ないかと思ってたんですがinitの場合のみは便利そうだと今思ったんですよね。
Avatar
omochimetaru 13-Jun-19 02:02 AM
個人的にはunsafe contextを導入する必要無い気がする
まあそうだけど、クロージャに
UnsafePointer渡ってくるならわかるし
ポインタが絡まないunsafeなinitのパターンを思いつかない。
Avatar
t.ae 13-Jun-19 02:03 AM
それはそうですね。 その場合クロージャ引数のUnsafe~でunsafeなことが表明されてるので関数名には要らないんじゃないかというのが僕の考えなんですが。 (edited)
Avatar
omochimetaru 13-Jun-19 02:06 AM
trailing closureでラベルが消えた場合の予備的な話だから原則はつけるで良い
Avatar
t.ae 18-Jun-19 07:03 AM
@swiftbot
let a = [0, 1, 2] a.withUnsafeBufferPointer { defer { print($0) } _ = $0 }
🛠 1
Avatar
swiftbot BOT 18-Jun-19 07:03 AM
Author icon t.ae
let a = [0, 1, 2] a.withUnsafeBufferPointer { defer { print($0) } _ = $0 }
Version:
swift-4.2.1-RELEASE
Output:
Error:
/usercode/main.swift:4:15: error: anonymous closure argument not contained in a closure print($0) ^
Avatar
t.ae 18-Jun-19 07:04 AM
deferはクロージャを取るのか🤔
Avatar
omochimetaru 18-Jun-19 07:05 AM
うん そこ構文的にそうなっちゃうのか
Avatar
t.ae 18-Jun-19 07:05 AM
https://bugs.swift.org/browse/SR-2305 大昔から報告されていた
Avatar
t.ae 20-Jun-19 06:07 AM
https://github.com/apple/swift/blob/2df36527d3d73c69966c3118be8e13cae544d8c4/stdlib/public/core/Integers.swift#L136-L138 これ@inlinableでも@_transparentでもないのか…… .zeroじゃなくて0書くだけで少し高速化できる。 (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 20-Jun-19 08:01 AM
bugs切っても良さそう
Avatar
t.ae 20-Jun-19 08:55 AM
そのままPR出してもよさそうな内容ですけどね。 bugsに報告しつつ自分にアサインしてPRがいいでしょうか。
Avatar
omochimetaru 20-Jun-19 08:55 AM
駄目ならPRがrejectされるだけなのでそれでも良いと思う
Avatar
t.ae 20-Jun-19 08:55 AM
ではそれでやってみます。
Avatar
kagemiku 25-Jun-19 07:27 AM
素朴な疑問なんですけど、String.init(cString:)が取る型はなぜUnsafePointer<Int8>で、UnsafePointer<UInt8>ではないんでしょうか? Character.asciiValueはUInt8なので気になりました。
let ptr = UnsafeMutablePointer<Int8>.allocate(capacity: len) ptr[0] = Int8(Character("n").asciiValue!) ptr[1] = Int8(Character("e").asciiValue!) ptr[2] = Int8(Character("k").asciiValue!) ptr[3] = Int8(Character("o").asciiValue!) ptr[4] = Int8(Character("\0").asciiValue!) let immutablePtr = UnsafePointer<Int8>(ptr)! let neko = String(cString: immutablePtr)
(edited)
Avatar
omochimetaru 25-Jun-19 07:27 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
そこの型は本当はCCharなんですよ。
CCharInt8のtypealiasなのでInt8に見えます。
Character.asciiValueに関してはアスキーキャラクターコードが 0x00 - 0xFF だからだと思います。
Avatar
kagemiku 25-Jun-19 07:28 AM
あ、そうでした、正確には UnsafePointer<CChar>で、そのaliasはなんでUint8ではないのかなーと
> Character.asciiValueに関してはアスキーキャラクターコードが 0x00 - 0xFF だからだと思います。 naruhodo
あー、
cにおけるcharは、符号付き1バイトなので、それに合わせようとするとtypealias CChar = Int8になるのですね
うーん、ASCIIは0x00 - 0x7Fだと思ってたのですが、この理解はもう古い感じですかね
Avatar
omochimetaru 25-Jun-19 07:36 AM
Ailias先に関しては
おそらくそのアーキテクチャでのC言語におけるcharがsignedかunsignedかによって決まっていて
Cにおけるchar型って負数をもつか持たないかがコンパイル環境によって変わります、それと連動してると思ってます。
ASCIIは0x00 - 0x7Fだと思ってた
たしかにそうですね。
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
asciiValue propertyのproposalですが、型についての言及が無さそう。
Avatar
kagemiku 25-Jun-19 07:40 AM
Cにおけるchar型って負数をもつか持たないかがコンパイル環境によって変わります、それと連動してると思ってます。
なんと、恥ずかしながらsigned固定かと思ってました。ありがとうございます
Avatar
omochimetaru 25-Jun-19 07:41 AM
Our nightly master branch build on s390x failed with the following error: 09:09:39 /home/swiftbuild/workspace/Swift/CONFIG/FIVE/GIT_BRANCH/master/label/csz25097/swift/lib/Parse/Lexer.cpp:2460:17: error: overflow converting case value to switch condition type (-2 to 254) [-We...
s390xっていう謎のCPUがunsignedで、
それの影響で自分のPRが壊れた事がw
レビュースレッドでも言及が無い気がします
Avatar
kagemiku 25-Jun-19 07:43 AM
↑にあげていただいたproposal、確かに特に説明なくUInt8で置かれてますね。
Avatar
omochimetaru 25-Jun-19 07:43 AM
なんとなくunsignedのほうがいい気がしますが、0x00-0x7Fを表現するという意味ではInt8でもUInt8でも全く同じですねえ
Avatar
kagemiku 25-Jun-19 07:43 AM
s390x,,,初耳です
Avatar
omochimetaru 25-Jun-19 07:44 AM
IBMのメインフレームらしいです。
😩 1
これ以上調べるなら、ここに書き込んで聞いてみるしかないかも? https://forums.swift.org/t/accepted-with-modification-se-0221-character-properties/14944
SE-0221: Character Properties has been accepted, with the exception of the .isEmoji property. The core team accepts the principle for the isEmoji property, but wants to continue the discussion of exactly how it should work. Therefore the thread will remain open for this spec...
Avatar
kagemiku 25-Jun-19 07:45 AM
0x00-0x7Fを表現するという意味ではInt8でもUInt8でも全く同じですねえ
ですね。
Avatar
omochimetaru 25-Jun-19 07:45 AM
規格上は、C言語のcharは1byte保証すら無いらしいですよ
ビット幅8bit以上の整数型としか決まってないらしくて
Avatar
kagemiku 25-Jun-19 07:46 AM
個人的に気になるので、案内頂いたforrumでも聞いてみます。 8bit以上 なんですね、知らなかったです。。
Avatar
omochimetaru 25-Jun-19 07:47 AM
それで、C++20で、符号なし8bitの文字用の型 char8_t が新たに導入されるらしい。
🤔 1
Avatar
norio_nomura 25-Jun-19 09:24 AM
UTF8を受け取るCのAPIがUnsafePointer<UInt8>!とかになってたりするから、UTF8でもあるasciiValueUInt8の方が便利そう。
Avatar
omochimetaru 25-Jun-19 10:45 AM
たしかに。
Avatar
kagemiku 25-Jun-19 01:37 PM
同じような回答をforumの方でも受け取りました。 https://forums.swift.org/t/accepted-with-modification-se-0221-character-properties/14944/4?u=kagemiku
Swift uses unsigned types for these purposes throughout the language: ASCII.CodeUnit is a typealias for UInt8.
Avatar
koher 01-Jul-19 11:44 PM
AtCoderやったことないけど、↓書いておいたらSwiftアップデートしてもらえるのかな?よくSwiftのバージョンが古いと言ってる人を見かけるので。 https://twitter.com/chokudai/status/1145624486546309120?s=21
言語アップデートのSpreadSheet出しておきまーす。編集してねー。 (良く分かってる人がいくつか書いてくれないと多分訳が分からない状態なのでchokudai垢のみで先行告知してます) https://t.co/1AY9yVyKM3
こういうときこそ -Ounchecked (edited)
Avatar
omochimetaru 02-Jul-19 12:34 AM
たしかに使い所な気がする
Avatar
koher 02-Jul-19 01:14 PM
Swift もできてたので -Ounchecked を提案してみた。
Avatar
freddi 03-Jul-19 11:20 AM
protocol Protocol { associatedtype T1 associatedtype T2 func myFunc<Bar, Baz>(_: Bar) -> Class<Bar.T1, Baz> where Bar: Class<T1, T2> } class Class<T1, T2> : Protocol { func myFunc<Bar, Baz>(_: Bar) -> Class<Bar.T1, Baz> where Bar: Class<T1, T2> { } }
このコードをコンパイルしようとすると Abort Trap:6 になるのですが、これって既知のバグでしょうか 🤔
もうちょっとシンプルにできました
protocol Protocol { associatedtype T1 func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> } class Class<T1> : Protocol { func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> { } }
Avatar
kateinoigakukun 03-Jul-19 11:25 AM
あー、型パラと同名のassoctypeは壊れてます
確かチケット切ったはず
Avatar
freddi 03-Jul-19 11:31 AM
お、ありがとうございます 🙇
Avatar
kateinoigakukun 03-Jul-19 11:31 AM
無かった…夢かな?
Avatar
freddi 03-Jul-19 11:32 AM
もうちょい調べてみます!
Avatar
kateinoigakukun 03-Jul-19 11:33 AM
似たような奴はレポートしてたので参考になれば。 https://bugs.swift.org/browse/SR-9533
🙇 1
Avatar
freddi 03-Jul-19 11:56 AM
@swiftbot
protocol Protocol { associatedtype T1 func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> } class Class<T2> : Protocol { func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T2> { } }
🛠 1
Avatar
swiftbot BOT 03-Jul-19 11:56 AM
Author icon freddi
protocol Protocol { associatedtype T1 func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> } class Class<T2> : Protocol { func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T2> { } }
Version:
swift-4.2.1-RELEASE
Output:
Error:
/usercode/main.swift:4:43: error: reference to invalid associated type 'T1' of type 'Bar' func myFunc<Bar>(_: Bar) -> Class<Bar.T1> where Bar: Class<T1> ^ /usercode/main.swift:7:7: error: type 'Class<T2>' does not conform to protocol 'Protocol' class Class<T2> : Protocol { ^ /usercode/main.swift:2:20: note: protocol requires nested type 'T1'; do you want to add it? associatedtype T1 ^
Avatar
freddi 03-Jul-19 11:57 AM
あ、ミスった
Avatar
freddi 03-Jul-19 12:46 PM
@kateinoigakukun san 型パラと別名のassociatedtypeにしたら通ったのと、https://bugs.swift.org/browse/SR-9533 のRogerさんのコードのスタックトレースのWhile emitting witness table for protocol conformance to ...が僕のと同じなので既知のBugでした、ありがとうございました 🙇
Avatar
kateinoigakukun 03-Jul-19 12:59 PM
そういえばRogerさんはLINEの方でしたね
Avatar
freddi 03-Jul-19 01:20 PM
あ、気づかなかったけどそのRogerさんだ
Avatar
t.ae 04-Jul-19 06:01 AM
@swift-4.2.4 @swift-5.0.3
swift struct ZeroRNG: RandomNumberGenerator { // Implements `mutating func next() -> UInt64` func next() -> UInt64 { return 0 } } let rng = ZeroRNG() print(rng.next()) var rng2 = rng print(Float.random(in: 0..<1, using: &rng2))
(edited)
Avatar
swift50 BOT 04-Jul-19 06:01 AM
0 0.0
(edited)
Avatar
swift42 BOT 04-Jul-19 06:01 AM
0 0.0
(edited)
Avatar
t.ae 04-Jul-19 06:03 AM
protocol側でmutatingとされてるのをnonmutatingで実装って前からできてましたっけ? SystemRandomNumberGeneratorあたりにできなかった名残がありますが。 https://github.com/apple/swift/blob/master/stdlib/public/core/Random.swift#L157
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 04-Jul-19 06:04 AM
ちょっと前に @t.ae がUnsafePointer系の話したときに
できることが確認できてた。
Avatar
t.ae 04-Jul-19 06:04 AM
完全に記憶に無いですねそれ
Avatar
omochimetaru 04-Jul-19 06:04 AM
sortとかnonmutatingにできる話
Avatar
t.ae 04-Jul-19 06:04 AM
ああ、それか。
Avatar
t.ae 04-Jul-19 06:12 AM
一月ちょっと前でしたね。記憶力が弱い。
Avatar
norio_nomura 12-Jul-19 06:43 AM
someassociatedTypeの型を制限する @swift-5.1.5
protocol P1 { associatedtype A var a: A { get } } protocol AisInt: P1 where A == Int {} struct S<A>: P1 { var a: A } extension S: AisInt where A == Int {} func f1() -> some P1 { S(a: 1) } func f2() -> some AisInt { S(a: 1) } print(f1().a is Int) print(f2().a is Int)
Avatar
swift51 BOT 12-Jul-19 06:43 AM
true true
stderr:
<stdin>:15:14: warning: 'is' test is always true print(f2().a is Int) ^
Avatar
norio_nomura 13-Jul-19 05:32 AM
Combineで このsomeを使ってみようとしたけど、someがネストすると型推測がうまくいかず断念した。
Avatar
norio_nomura 18-Jul-19 03:28 AM
Xcode 11 beta 4でCombineの変更多いな。
Avatar
norio_nomura 22-Jul-19 05:28 AM
✍ Combineの変更メモ Publishers.DeferredDeferredへ変更 Publishers.EmptyEmptyへ変更 Publishers.FailFailへ変更 Publishers.OnceResult.Publisherへ変更 Publishers.OptionalOptional.Publisherへ変更 Publisher型毎の特化実装メソッドが減る。 PublishedのpropertyWrapper仕様が更新(acceptされた最新ではない) keyPath map関連がFoundationからCombineへ移動。
👏 2
Avatar
norio_nomura 22-Jul-19 05:37 AM
APIシグネチャに現れない変更としては、AnyCancellableをちゃんと保持しないと即座に解放される様になり、非同期なPublisherとかも解放されてしまい動かなくなった(たぶん正しい挙動になった)
Avatar
yutailang0119 24-Jul-19 02:12 AM
これコンパイル通るし、bar はString?として扱えるのすごいな
@propertyWrapper public struct UserDefault<Value> { private let key: String private let defaultValue: Value private let defaults: UserDefaults public init(key: String, defaultValue: Value, defaults: UserDefaults = .standard) { self.key = key self.defaultValue = defaultValue self.defaults = defaults } public var wrappedValue: Value { get { (defaults.object(forKey: key) as? Value) ?? defaultValue } set { defaults.set(newValue, forKey: key) } } } final class A { @UserDefault(key: "foo", defaultValue: nil, defaults: .standard) var foo: String? @UserDefault(key: "bar", defaultValue: nil, defaults: .standard) var bar: String }
(edited)
Avatar
norio_nomura 25-Jul-19 02:55 AM
CombineのCurrentValueSubjectは CoWとかしないんだね。 当たり前。
let subject1 = CurrentValueSubject<Int, NSError>(1) let subject2 = subject1 subject1.value = 5 subject2.value == 5 // true
(edited)
あ、これ参照型だった…
Avatar
yoshiki 25-Jul-19 06:02 AM
アクションゲームを公開しました!遊んでいただけるとありがたいです。 https://apps.apple.com/jp/app/continue-jump/id1473919172
‎ジャンプし続けて、素晴らしいゴールを目指そう! 2種類のジャンプを横スクロールアクションゲームに追加しました。
Avatar
norio_nomura 29-Jul-19 03:58 AM
Codable, Equatable, Hashableとか、その実装がコンパイラにより生成されたものを利用している、を保証する様な仕組みが欲しい気がする。
Avatar
omochimetaru 29-Jul-19 03:59 AM
手動実装してたら検出したい?
Avatar
norio_nomura 29-Jul-19 04:07 AM
ですね。自動生成されてる実装に対するテストを書きたくない。
Avatar
tarunon 29-Jul-19 04:08 AM
要素が自動実装かどうかを再帰的にチェックしなきゃいけない?
Avatar
omochimetaru 29-Jul-19 04:09 AM
たしかに。自分の場合は手書きから自動に切り替えた時に古い手書き実装がちゃんと消えてるか保証したいことがあります。
Avatar
omochimetaru 30-Jul-19 02:16 AM
プロトコルのexistentialがEquatableを与えるとexistentialとして使えなくなるのが不便・・・
func ==(P, P) が実装してあっても、 P? == P? はできないのですぐ詰まる
Avatar
norio_nomura 30-Jul-19 07:55 AM
Xcode 11 beta 5で、Combineの実装がOpenCombineの影響受けてる様に見える。
具体的にはAnySubscriberの実装が変わった。
今まではSubscriberが要求する3つのインスタンスメソッドを保持する事で型を消してたけど、Boxクラスを使う形式に変わってる。
その変更に絡んで、AnySubscriber周りで@inlinableが使われる様になったため、Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Combine.framework/Modules/Combine.swiftmodule/x86_64.swiftinterfaceを見ると実装がほぼ丸見え。
Avatar
Cormano15 30-Jul-19 08:04 AM
konichiwa
im from philippines
and i want to work in japan soon
Avatar
norio_nomura 30-Jul-19 08:11 AM
@Cormano15 #recruitment is a suitable channel for job search. However, since it seems that the job search on this server is not active, I think it is better to search on other servers.
Avatar
Cormano15 30-Jul-19 08:12 AM
okay thank you
Avatar
norio_nomura 03-Aug-19 07:23 AM
[SE-0249] Key Path Expressions as Functions、まだ実装終わってなかったのか。残念。 https://github.com/apple/swift/pull/26054
This builds on @brentdax&#39;s work in #23435 to handle optional chaining key paths as both KeyPath BGTs and as function types, and also does away with explicit disjunctions to determine which ...
Avatar
norio_nomura 03-Aug-19 10:24 AM
Dictionary.subscriptdefaultは、mutatingメンバを使うとDictionaryへ登録できる。 @swift-5.0.3
class ClassBox { var name = "" } var classDictionary = [String: ClassBox]() classDictionary["test", default: ClassBox()].name = "name" print("classDictionary:", classDictionary) struct ValueBox { var name = "" } var valueDictionary = [String: ValueBox]() valueDictionary["test", default: ValueBox()].name = "name" print("valueDictionary:", valueDictionary)
(edited)
Avatar
swift50 BOT 03-Aug-19 10:24 AM
classDictionary: [:] valueDictionary: ["test": main.ValueBox(name: "name")]
(edited)
Avatar
norio_nomura 06-Aug-19 12:24 AM
別の Combine 互換実装 https://github.com/luoxiu/CombineX
CombineX is an open source implementation for Apple's Combine specs. - luoxiu/CombineX
Avatar
koher 08-Aug-19 04:18 AM
この前話してた Class Existential Container の話、プロトコルの後付けを考えると existential 側に witness table を持つしかないように思うんですがどうでしょうか?
Avatar
omochimetaru 08-Aug-19 04:20 AM
それは関係ないんじゃないですか? 現状でも実行時の検索ができている以上。
Avatar
norio_nomura 08-Aug-19 04:28 AM
プロトコルの後付けを考えると existential 側に witness table を持つしかない
僕も同じ結論でした。
(edited)
Avatar
koher 08-Aug-19 06:39 AM
@omochimetaru 後付けされたプロトコルに対応したwitness tableをインスタンスに差し込んだらメモリレイアウトが変わっちゃうんじゃない?
Avatar
omochimetaru 08-Aug-19 06:58 AM
その観点だけなら、現状でも実行時に検索ができているので関係なくないですか?
この前の野村さんの実験で、ある型が満たしてるプロトコルすべてを実行時にイテレートできる事がわかった、という理解です (edited)
Avatar
norio_nomura 08-Aug-19 07:27 AM
サブクラスが追加でプロトコルに準拠してて、スーパークラス & プロトコルなExistentialを表現する際にはwitness tableが必要になるかと。スーパークラスの時点で準拠してるプロトコルについては不要。
Avatar
omochimetaru 08-Aug-19 07:35 AM
そのケースもインスタンスの型からサブクラスのconformsをチェックできるんじゃないですか?
Avatar
norio_nomura 08-Aug-19 07:41 AM
実行時、Existentialが準拠すべきプロトコルを検索する際に、検索結果を格納するデータ構造が必要になる。それがwitness tableで代用されてて、Existentialのメンバを使う際にもそれを活用できて便利、な感じ?
Avatar
omochimetaru 08-Aug-19 07:43 AM
witness tableはコンパイル時に検索した結果をデータと一緒に取り回す事で、実行性能を改善してる仕組み、という理解です ちょっとハッキリさせるために今コード書いて確認してます。
Avatar
omochimetaru 08-Aug-19 07:52 AM
@norio_nomura モジュールaて定義された親クラスCを、モジュールbのクラスDが継承しつつ、DがPへのconditional conformanceを持っているケースです
Avatar
norio_nomura 08-Aug-19 07:54 AM
ふむ。
Avatar
omochimetaru 08-Aug-19 07:55 AM
conformance checkする関数はAnyで受けているので、ややこしいexistentialとかでも、最終的には動的にチェックできる事が確認できると思います。Anyへのキャストはどんなオブジェクトでも可能なので。
Avatar
norio_nomura 08-Aug-19 08:00 AM
ふむ。
Avatar
omochimetaru 08-Aug-19 08:01 AM
プロトコルの後付けを考えると existential 側に witness table を持つしかない
これの「しかない」に対する反論証明にもなってると思います。
Avatar
norio_nomura 08-Aug-19 08:06 AM
conform確認した(キャストした)後、それのメンバをwitness tableから実行するわけですよね。
Avatar
omochimetaru 08-Aug-19 08:06 AM
そうですね
Avatar
norio_nomura 08-Aug-19 08:07 AM
プロトコルメソッド実行時に毎回witness tableを検索する、ってのは毎回キャストする、に等しいのでは。
Avatar
omochimetaru 08-Aug-19 08:07 AM
conform確認する=キャストする=witness tableを取得する=その中のwitness methodを使えるようにする
はい、そう思ってます。> ってのは毎回キャストする、に等しい
Avatar
norio_nomura 08-Aug-19 08:08 AM
キャスト結果を使い回す=existentialがwitness tableを保持する、なのでは。 (edited)
Avatar
omochimetaru 08-Aug-19 08:08 AM
まあ、例えば、Pにキャストした後のメソッド呼び出しが連続しているなら、コンパイラ最適化でwitness tableは使い回すとかはできるかもしれないですが。
そうですね、キャストした時に何を検索して何を取り出すか、が、existentialの型Pに対してコンパイル時に決定できるから、コンパイル時に1度キャストしておいて実行時はそれをずっと使い回すから速い、って事だと思います。 (edited)
Avatar
norio_nomura 08-Aug-19 08:17 AM
プロトコルの後付けを考えると existential 側に witness table を持つしかない
これ
プロトコルの後付けを考えると existential 側にプロトコル準拠情報を持つしかない (現在の実装はwitness tableで表現)
って事かと。
(edited)
Avatar
omochimetaru 08-Aug-19 08:20 AM
witness tableでもそこを抽象的に言っても、何も持たなくても毎回キャストする実装で動かすことはできるので、いずれにしても「しかない」は間違いでは。
Avatar
norio_nomura 08-Aug-19 08:35 AM
as? の右側のプロトコル部分を実行時に変えられる様にならない限りはそうなるのかな? (edited)
今のところ、キャスト先の型が実行時にしか判らない、ってコードは書けないよね。書ける。 (edited)
Avatar
omochimetaru 08-Aug-19 08:38 AM
func cast<T>(_ x: X, type: T.Type) -> X? { return x as? T }
↑こういうのはかけますよ
でもTをプロトコルで埋めることはできませんね。「プロトコルのメタタイプ」は存在しないから。
Avatar
norio_nomura 08-Aug-19 08:43 AM
それって、コンパイル時にキャスト先の型が決まるのでは?
Avatar
omochimetaru 08-Aug-19 08:44 AM
class A { func foo() { } } class B <T> : A { override func foo(x: Any) { if let t = cast(x, T.self) { ... } } } func f(a: A) { a.foo() }
(edited)
↑こんな感じだったら、関数fのコンパイル時には決定しないです
👌 1
Avatar
norio_nomura 08-Aug-19 08:58 AM
@swift-5.1.5
class C {} func cast<P>(_ any: Any, _ type: P.Type) -> (C & P)? { any as? (C & P) }
Avatar
swift51 BOT 08-Aug-19 08:58 AM
exit status: 1 with stderr:
<stdin>:3:50: error: non-protocol, non-class type 'P' cannot be used within a protocol-constrained type func cast<P>(_ any: Any, _ type: P.Type) -> (C & P)? { ^ <stdin>:3:50: error: non-protocol, non-class type 'P' cannot be used within a protocol-constrained type func cast<P>(_ any: Any, _ type: P.Type) -> (C & P)? { ^ <stdin>:4:18: error: non-protocol, non-class type 'P' cannot be used within a protocol-constrained type any as? (C & P) ^
Avatar
norio_nomura 08-Aug-19 09:06 AM
as? の右側のプロトコル部分を実行時に変えられない」は合ってる? (edited)
Avatar
tarunon 08-Aug-19 09:10 AM
そもそもこの場合、Pはprotocolではないから&は出来ないのでは (edited)
protocolを埋めてもexistentialになるので
Avatar
omochimetaru 08-Aug-19 09:11 AM
@swift-5.1.5
protocol P {} class A {} class B : A, P {} func f() -> A & P { return B() }
Avatar
swift51 BOT 08-Aug-19 09:11 AM
no output
Avatar
omochimetaru 08-Aug-19 09:11 AM
できるよ。
Avatar
tarunon 08-Aug-19 09:12 AM
genericsに与えた時点で
Avatar
norio_nomura 08-Aug-19 09:12 AM
うん。ジェネリックパラメータがプロトコルである事を保証する仕組みがないよね。
Avatar
tarunon 08-Aug-19 09:12 AM
existentialとして扱われるからダメなのでは、という話
Avatar
omochimetaru 08-Aug-19 09:12 AM
「as? の右側のプロトコル部分を実行時に変えられない」
そうですね。パラメータにプロトコルを入れられないので。
as?によるキャストは普通の型の場合と protocol existentialの場合で全然別物が2種類あるのかな?
Avatar
norio_nomura 08-Aug-19 09:14 AM
先日dynamicCastを調べた際には、別れてたはず。
Avatar
tarunon 08-Aug-19 09:14 AM
asキャストは沢山ある…
Avatar
omochimetaru 08-Aug-19 09:14 AM
野村さんがぼっとになげたコードはそもそもコード中に P の宣言が無いから変なエラーが出てる。
Avatar
norio_nomura 08-Aug-19 09:14 AM
Pの宣言はジェネリックパラメータとしてあるよ。 (edited)
Avatar
tarunon 08-Aug-19 09:14 AM
genericsの型パラですね、ただそれは
Avatar
omochimetaru 08-Aug-19 09:15 AM
ああ!見えてなかった。
Avatar
tarunon 08-Aug-19 09:15 AM
SomeProtocol.selfはたぶん、existentialの型になっちゃうと思うんですよ
Avatar
omochimetaru 08-Aug-19 09:15 AM
なっちゃうというかかけないよ。
Avatar
tarunon 08-Aug-19 09:15 AM
あ、出来ないか、そうか
Avatar
omochimetaru 08-Aug-19 09:15 AM
コンパイルエラーだよ
Avatar
norio_nomura 08-Aug-19 09:15 AM
ジェネリックパラメータがプロトコルである事を保証する仕組みがない
Avatar
omochimetaru 08-Aug-19 09:15 AM
func f(_ x: Any) -> (A & P)? { return x as? A & P }
静的なら&付きprotocolのas自体は書ける。
Avatar
norio_nomura 08-Aug-19 09:16 AM
それはコンパイル時にプロトコルが決まってるよね。
Avatar
omochimetaru 08-Aug-19 09:16 AM
ですね
Avatar
tarunon 08-Aug-19 09:16 AM
例えばGenericsでTのvalueを受ける関数に、Animalのexistentialを渡すと、TはAnimalのexistentialになるので、と混ざっていた
Avatar
omochimetaru 08-Aug-19 09:17 AM
@swift-5.1.5
protocol P {} func f<T>(_ x: Any, _ t: T.Type) -> (P & T)? { return x as? P & T }
(edited)
Avatar
swift51 BOT 08-Aug-19 09:17 AM
exit status: 1 with stderr:
<stdin>:2:42: error: non-protocol, non-class type 'T' cannot be used within a protocol-constrained type func f<T>(_ x: Any, _ t: T.Type) -> (P & T)? { ^ <stdin>:2:42: error: non-protocol, non-class type 'T' cannot be used within a protocol-constrained type func f<T>(_ x: Any, _ t: T.Type) -> (P & T)? { ^ <stdin>:3:22: error: non-protocol, non-class type 'T' cannot be used within a protocol-constrained type return x as? P & T ^
(edited)
Avatar
omochimetaru 08-Aug-19 09:17 AM
P & A の A の部分も <T> にはできないな。
Avatar
tarunon 08-Aug-19 09:18 AM
non-classって書かれてるから、TをAnyObjectで縛ったら通らないかな? (edited)
Avatar
omochimetaru 08-Aug-19 09:18 AM
同じエラーが出るよ
Avatar
norio_nomura 08-Aug-19 09:18 AM
コンパイル時に必要となるプロトコルが決まっているなら、class existentialにwitness tableは無くても構わないはず。> 「existential 側にプロトコル準拠情報を持つしかない」の「しかない」を否定。 って事ですよね。
Avatar
omochimetaru 08-Aug-19 09:20 AM
あ、そういう話か、そこまでは考えてませんでした。もしキャスト宛先のプロトコルそれ自体が動的に決定する場合、今のランタイムだと、どんな問題が生じるという考えですか? (edited)
(そもそもキャストの宛先プロトコルが動的だとしたら、キャスト結果の値を使うコードを書きようが無い気もするけど)
Avatar
norio_nomura 08-Aug-19 09:22 AM
@dynamicMemberLookupとかあるよ。 (edited)
Avatar
omochimetaru 08-Aug-19 09:23 AM
それは文字列が渡るだけで関係ないような?
Avatar
norio_nomura 08-Aug-19 09:25 AM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 08-Aug-19 09:26 AM
特にプロトコルにキャストしていたとしても、このへんは挙動は変わらない気がします 元の型に実装されてるロジックが呼び出されるだけですよね
Avatar
norio_nomura 08-Aug-19 09:28 AM
(そもそもキャストの宛先プロトコルが動的だとしたら、キャスト結果の値を使うコードを書きようが無い気もするけど)
キャスト結果の値を使うコードを書きようがない。って事はないのでは?と思ったので。
Avatar
omochimetaru 08-Aug-19 09:28 AM
そういう意味ではまあ、変数にコピーしたり配列に入れたりはできますね。 キャスト結果ならではの何かという意味でした。
Avatar
norio_nomura 08-Aug-19 09:29 AM
まあ、今はできないから空論ですね。
Avatar
omochimetaru 08-Aug-19 09:29 AM
あーまあ、そこまでダイナミックな処理系を想定するなら、その動的なプロトコルメタタイプが入ってる値に対して、生えてるプロトコルメソッドを文字列で全部取得できて、そこから特定の名前のメソッドを実行するとか、か。
Avatar
norio_nomura 08-Aug-19 09:31 AM
プロトコルの後付けを考えると existential 側に witness table を持つしかない
これ
プロトコルの後付けを考えると existential 側にプロトコル準拠情報を持つしかない (現在の実装はwitness tableで表現)
って事かと。
改め、
プロトコルの後付けを考えると existential 側にプロトコル準拠情報を持つのが自然 (現在の実装はwitness tableで表現)
って感じかな。
Avatar
omochimetaru 08-Aug-19 09:31 AM
そこを修正したとしても、まだ、 「後付を考えると」の部分は疑問です。
witness tableのペアでもつ高速化は、後付が無かったとしても有効なテクニックだと思うし、
後付けがあったとしても動的に取れるという点は変わっていません。
Avatar
norio_nomura 08-Aug-19 09:32 AM
今は不要ならclass existentialにwitness tableは付かないって、ドキュメントに書かれてるよ。 (edited)
Avatar
omochimetaru 08-Aug-19 09:34 AM
ほお、それは全く知らなかった、どういう状況を言うんだろ
Avatar
norio_nomura 08-Aug-19 09:36 AM
https://discordapp.com/channels/291054398077927425/306995750418513920/607062064372121620
Class Existential Container が Witness Table を保持するのはなぜかって疑問。
これ、今更だけど、 https://github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst#class-existential-containers
Note that if no witness tables are needed, such as for the "any class" type protocol<class> or an Objective-C protocol type, then the only element of the layout is the heap object pointer.
って注意書きがあるね。プロトコル制約がある時だけwitness tablesを持つ。
(edited)
Avatar
omochimetaru 08-Aug-19 09:36 AM
ん、ああ、そうですね。
AnyObject型が、class existentialのプロトコル数0の場合なので、そのときは0個です。
AnyObject & P のときは1個、AnyObject & P & Q のときは 2個、てな具合。
かつ、AnyObject単体のときtable数が0なのでレイアウトがポインタ1つだけになって、普通にthisポインタを取り回してるのと同じになりますね
Avatar
norio_nomura 08-Aug-19 09:45 AM
このコードでも律儀に_swift_dynamicCastが呼ばれるな。 @swift-5.1.5
protocol P {} class C: P {} func cast(_ any: Any) -> (C & P)? { any as? (C & P) } _ = cast(C())
(edited)
Avatar
swift51 BOT 08-Aug-19 09:45 AM
no output (edited)
Avatar
omochimetaru 08-Aug-19 09:46 AM
Anyにしちゃったら、それしか無いと思います
swift_conformsToSwiftProtocolImplの中で__swift5_protoセクションの中のレコードを探すところですけど、
そのバイナリにある全部のコンフォーマンスを線形探索して、プロトコルが一致してるやつを取ってるんですよね?
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
for (const auto &record : section) { auto &descriptor = *record.get(); // We only care about conformances for this protocol. if (descriptor.getProtocol() != protocol) continue;
ああ、でも、その結果をキャッシュしてるのか。
めちゃくちゃ重いと思ったけど初回だけだな。
Avatar
norio_nomura 08-Aug-19 09:52 AM
Anyにしちゃったら、それしか無いと思います
あ、そか。
Avatar
omochimetaru 08-Aug-19 09:53 AM
https://github.com/apple/swift/blob/b70cd7031fe7a2c400976007abbfff1597189174/stdlib/public/runtime/ImageInspectionMachO.cpp#L141-L145
void swift::initializeProtocolConformanceLookup() { REGISTER_FUNC( addImageCallback<TextSegment, ProtocolConformancesSection, addImageProtocolConformanceBlockCallback>); }
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
#define REGISTER_FUNC(...) _dyld_register_func_for_add_image(__VA_ARGS__)
When you call _dyld_register_func_for_add_image, the dynamic linker runtime calls the specified callback (func) once for each of the images that is currently loaded into the program. When a new image is added to the program, your callback is called again with the mach_header for the new image, and the virtual memory slide amount of the new image.
Avatar
norio_nomura 08-Aug-19 09:54 AM
確認すべきは、キャスト後のexistentialがwitness tableを保持してるかどうかか。
Avatar
omochimetaru 08-Aug-19 09:54 AM
こんな便利な関数があるのだな。
動的オブジェクトファイルがロードされるたび+初回はすでにロードされているものに関して、ローダー側がコールバックを呼んでくれるのか。
後付けされたプロトコルに対応したwitness tableをインスタンスに差し込んだらメモリレイアウトが変わっちゃうんじゃない?
これで、この問の答えも得られた。
Avatar
norio_nomura 08-Aug-19 09:58 AM
ちゃんと公式ドキュメントページ(manだけど)あるよ。 https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/dyld.3.html
HTML versions of the iOS man pages.
Avatar
omochimetaru 08-Aug-19 09:58 AM
あ、ググって出てきたの見てたけど、謎のURLでした。
Avatar
norio_nomura 08-Aug-19 10:14 AM
protocol P {} class C: P {} func cast(_ any: Any) -> (C & P)? { any as? (C & P) } _ = cast(C())
これ、C & Pのメタデータを用意してキャストするコードが生成されるから、witness tableも持ってそう。Cが既にPだというのは考慮されていない感じ。
Avatar
omochimetaru 08-Aug-19 10:15 AM
なるほど
Avatar
norio_nomura 08-Aug-19 10:28 AM
いや、そもそもwitness tableが幾つ必要なのか?とか含めて全部_swift_dynamicCastに丸投げで、結果witness table不要となる可能性があるのかも。
Avatar
koher 08-Aug-19 04:07 PM
あー、アップキャストばっかり考えてたけど、確かにダウンキャストできるんだからインスタンスから引けないとおかしいですね。
Avatar
omochimetaru 22-Aug-19 02:39 AM
↑序盤は mapのほうが人気だったけど途中で逆転してcompactMapが勝った。
Avatar
t.ae 22-Aug-19 02:40 AM
mapのほうがArray作成が一度だけで良い感じがしますね。
Avatar
omochimetaru 22-Aug-19 02:42 AM
compactMapの方は Array<Optional<T>> が一度作られるところの複雑度が高い気がするけど mapの方は ?? [] のところでArrayのカッコがまた出てくるのが気に食わん。
Avatar
tarunon 22-Aug-19 03:48 AM
mapの方は要素が1個の時しか使えないけどcompactMapの方は要素が複数でも使える
Avatar
norio_nomura 22-Aug-19 03:57 AM
計算量を考えるとmapの方だ。
Avatar
masakihori 22-Aug-19 05:52 AM
僕は opt != nil ? [opt!] : [] に終着した
Avatar
t.ae 22-Aug-19 05:53 AM
あとスマートキャストさえあれば・・・って感じですね
Avatar
omochimetaru 22-Aug-19 05:53 AM
僕は opt != nil ? [opt!] : [] に終着した
!があるのが嫌だけど直感的には一番わかりやすいですね
Avatar
hironytic 23-Aug-19 03:19 AM
僕は opt != nil ? [opt!] : [] に終着した
ぼくはmapの方に1票入れたけど、これが好き。Kotlinのスマートキャストがあれば…
あ、もう言われてた。
😄 1
Avatar
omochimetaru 20-Sep-19 04:09 AM
protocol P : AnyObject {} struct S<T: AnyObject> {} // 'S' requires that 'P' be a class type S<P>()
(edited)
クラスプロトコルのexistentialはクラスではないらしい。
protocol P : AnyObject {} class C : P {} struct S<T: AnyObject> {} var a: P = C() var b: AnyObject = a as AnyObject
でもAnyObjectへのアップキャストはできる。
Avatar
omochimetaru 20-Sep-19 04:21 AM
P?weak varも作れるんだよなあ。
Avatar
norio_nomura 27-Sep-19 01:52 AM
iOS 13.1の中でSwiftが使われているものをリストアップしてる記事。 https://blog.timac.org/2019/0926-state-of-swift-ios13/
👀 1
Avatar
tarunon 27-Sep-19 01:54 AM
classではないというエラーメッセージが不親切だと思う、コンパイルできないのはそれはそうなんじゃないかな @omochimetaru (edited)
Avatar
omochimetaru 27-Sep-19 03:54 AM
ClassExistentialContainerでProtocol Conformanceが1件もない場合 = :AnyObjectの場合は
struct ClassExistentialContainer { HeapObject *value; WitnessTable *witnessTables[NUM_WITNESS_TABLES]; };
↑witnessTablesが0バイトになるから、ポインタ1つだけになるので、クラス型と全く同じrepresentatiojになるので
なんとかなってほしい
Avatar
tarunon 27-Sep-19 04:15 AM
そもそもそこはGenerics渡しである必要があるの? (edited)
Existential渡しで良さそう
Avatar
omochimetaru 27-Sep-19 04:18 AM
struct Weak<T: AnyObject> { }
↑これに入れたかった
Avatar
tarunon 27-Sep-19 04:59 AM
型がほしいのか〜
参照型持たせるならstructよりclassの方がよくない?
Avatar
omochimetaru 27-Sep-19 05:00 AM
ん、それはなぜ?
Avatar
tarunon 27-Sep-19 05:00 AM
あ、そうだおもちさん
protocol@objc protocolにすれば
Avatar
omochimetaru 27-Sep-19 05:00 AM
structのほうがパフォーマンス良いと思うよ
Avatar
tarunon 27-Sep-19 05:00 AM
Exsitentialでも通るようになるよ
多分
Avatar
omochimetaru 27-Sep-19 05:00 AM
あー、たぶんそうだね
@objc使いたくないンゴね
Avatar
tarunon 27-Sep-19 05:00 AM
あきらめろん
Avatar
omochimetaru 27-Sep-19 05:01 AM
しょうがないのでWeak用のTypeErasureを別に作ったよ
Weak<AnyP> こうすると駄目で、これ面白くって
OwnerAはT: P をstrong参照 AnyP<X: P>T: Pを内部でstrong参照 Weak<Y>Y = AnyP<T>を内部でweak参照
あら不思議AnyPがリリースされてしまいます
なので WeakAnyPの実装が必要で、 これだとうまくいくんだな
🤔 1
Avatar
norio_nomura 05-Nov-19 12:48 AM
Xcode 11.2のswiftは5.1.2なのにswift-5.1.2-RELEASEは出ないのかな。
Avatar
omochimetaru 22-Nov-19 04:02 AM
extension Optional { public mutating func consume<R>(_ f: (Wrapped) throws -> R) rethrows -> R? { guard let x = self else { return nil } self = nil return try f(x) }
👀 1
↑最近こんなの作って使ってみてるんだけど使い所がかなり多くてめちゃ便利
self.cameraCapture.consume { $0.dispose() } // ↓と同じ if let c = self.cameraCapture { c.dispose() self.cameraCapture = nil }
(edited)
guard let capture = (self.cameraCapture.consume { $0 }) else { return } use(capture) // ↓と同じ guard let capture = self.cameraCapture else { return } self.cameraCapture = nil use(capture)
Avatar
nanasi 29-Nov-19 07:07 AM
protocol Enum { static func associatedValue(_ value: String) -> Self static var singleValue: Self { get } } enum Foo: Enum { case associatedValue(String) case singleValue }
enumのcaseをこんな感じでprotocolで表したい😫
Avatar
tarunon 29-Nov-19 07:09 AM
RawReplesentableを見てみると良いかも
あー、caseを定義か。理解しました
Avatar
omochimetaru 29-Nov-19 07:12 AM
static func名とcase名は重ねられない気がした
Avatar
nanasi 29-Nov-19 07:18 AM
一応定義はできるのですが自己参照になっちゃいますね… (edited)
Avatar
omochimetaru 29-Nov-19 07:18 AM
なるほど。
Avatar
nanasi 29-Nov-19 07:19 AM
あとはメソッド名を変えればですが結局それぞれのenumに手を入れなければならないのであまりいい感じにはできず…
protocol Enum { static func associatedValue(_ value: String) -> Self static var singleValue: Self { get } } enum Foo: Enum { static func associatedValue(_ value: String) -> Foo { _associatedValue(value) } static var singleValue: Foo { _singleValue } case _associatedValue(String) case _singleValue }
Avatar
omochimetaru 29-Nov-19 07:20 AM
そうですよね〜
「caseコンストラクタ(仮称)をstatic funcとしてprotocol conformanceできるようにする」
言語改修案として良さそう
Avatar
nanasi 29-Nov-19 07:24 AM
良いですね🤩
Avatar
t.ae 26-Dec-19 01:44 AM
@swiftbot
class X { init(){} deinit { print("deinit") } } do { let x = X() print(x) } let x = X() print(x)
(edited)
🛠 2
Avatar
swiftbot BOT 26-Dec-19 01:45 AM
(edited)
Author icon t.ae
class X { init(){} deinit { print("deinit") } } do { let x = X() print(x) } let x = X() print(x)
Version:
swift-5.1-RELEASE
Output:
main.X deinit main.X
Error:
Avatar
t.ae 26-Dec-19 01:45 AM
トップレベルに置かれてるのが
deinit呼ばれない?
Avatar
swiftbot BOT 26-Dec-19 01:46 AM
Author icon t.ae
class X { init(){} deinit { print("deinit") } } do { let x = X() print(x) } let x = X() print(x)
Version:
swift-DEVELOPMENT-SNAPSHOT-2019-11-08-a
Output:
main.X deinit main.X
Error:
Avatar
omochimetaru 07-Jan-20 07:37 AM
// c3.swift public protocol P { func foo() -> Int }
; c3.ll ... @"$s2c31PMp" = constant <{ i32, i32, i32, i32, i32, i32, %swift.protocol_requirement }> <{ i32 65603, ...
(edited)
// c4.cpp #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> int main() { void *handle = dlopen(nullptr, RTLD_LAZY); if (!handle) { printf("dlopen failed: %s\n", dlerror()); return 0; } void *symbol = dlsym(handle, "$s2c31PMp"); if (!symbol) { printf("symbol not found: %s\n", dlerror()); return 0; } int32_t flags = ((int32_t *)symbol)[0]; printf("flags=%d\n", flags); if (dlclose(handle)) { printf("dlclose failed: %s\n", dlerror()); return 0; } return 0; }
$ clang++ -std=c++14 c4.cpp -c -S -emit-llvm $ ./c4.out flags=65603
protocol descriptor、直接取れた (edited)
Avatar
tarunon 07-Jan-20 07:40 AM
そういえば FunctionHook していた時に
protocol descriptorとか partial applyとか のsymbol nameもあったのだけど
呼べるか試してないな。
Avatar
omochimetaru 07-Jan-20 08:22 AM
protocol EquatableOpener { init<T>(_ value: T) init<T: Equatable>(_ value: T) } func openEquatable<EO: EquatableOpener>(_ value: Any, openerType: EO.Type) -> EO { // 黒魔術 }
こんなライブラリ関数が作れる目処が立った
Avatar
tarunon 07-Jan-20 08:23 AM
黒魔術で草
Avatar
omochimetaru 07-Jan-20 08:24 AM
昨日から話してる AnyEquatable を openEquatableに渡せる
こういうインターフェースにしておけば、取り扱いをユーザーが決められる。
Avatar
tarunon 07-Jan-20 08:25 AM
つまり、EquatableOpenerの挙動をユーザー側で決定できると
Avatar
omochimetaru 07-Jan-20 08:25 AM
そう。ライブラリがやるのは、どっちのinitを呼ぶのかのディスパッチだけってこと。
Avatar
tarunon 07-Jan-20 08:25 AM
なるほどね
Equatableでユーザー側で決定したいシチュがあまり思いつかないのだけど、他のprotocolだと有用な場面がありそう
Avatar
omochimetaru 07-Jan-20 08:27 AM
たとえEquatableでも、
Int(0) == Double(0) にしたい人が0.1人ぐらい居るかも
Avatar
tarunon 07-Jan-20 08:27 AM
不埒者だw
Avatar
omochimetaru 07-Jan-20 08:28 AM
Foundation.AnyHashableは実際そう
Avatar
tarunon 07-Jan-20 08:28 AM
AnyHashableはそういう動きするよね
被った
Avatar
omochimetaru 07-Jan-20 08:28 AM
使いたくない型ナンバーワン
Avatar
tarunon 07-Jan-20 08:28 AM
わかる
Avatar
omochimetaru 07-Jan-20 08:28 AM
Swiftの世界観からすると完全にただの罠だよね
Avatar
tarunon 07-Jan-20 08:29 AM
せめて型情報焼き込んで欲しいんだよな
ObjectIdentifier使ってHasherに焼いて欲しい
Avatar
omochimetaru 07-Jan-20 08:29 AM
どういう意味だ??
Avatar
tarunon 07-Jan-20 08:32 AM
@swift-5.1.5
struct MyAnyHashable: Hashable { var originalHashValue: Int var originalTypeIdentifier: ObjectIdentifier init<H: Hashable>(_ origin: H) { self.originalHashValue = origin.hashValue self.originalTypeIdentifier = ObjectIdentifier(H.self) } } print(MyAnyHashable(1) == MyAnyHashable(1.0))
Avatar
swift51 BOT 07-Jan-20 08:32 AM
false
Avatar
tarunon 07-Jan-20 08:32 AM
こうだね
Avatar
omochimetaru 07-Jan-20 08:33 AM
なるほど。
それだとハッシュ値が同一のときに間違ってtrueになっちゃうけど。
Avatar
tarunon 07-Jan-20 08:33 AM
ああEquatableが壊れるということね
いやあくまでわかりやすくObjectIdentifierを持たせようぜという話で
Avatar
omochimetaru 07-Jan-20 08:34 AM
そゆことね
Avatar
tarunon 07-Jan-20 08:34 AM
EquatableそのままでObjectIdentifier持たせれば全部丸く解決するじゃろ
きっとAnyHashableと生Hashableが同一の値を返すモチベがあるんやろうなぁ
Avatar
omochimetaru 07-Jan-20 08:35 AM
単にNSDictionaryとかの挙動と合わせたいんじゃないか
NSDictionaryをSwiftから見ると Dictionary<AnyHashable, Any> だし。 (edited)
Avatar
tarunon 07-Jan-20 08:36 AM
ああ、あれは1と1.0がおなじなのか
Avatar
omochimetaru 07-Jan-20 08:36 AM
うん。intとか格納できないから NSNumber になる
その時にもとの型が消える。
Avatar
tarunon 07-Jan-20 08:38 AM
名前をUnsafeAnyHashableに変えて欲しい
Avatar
omochimetaru 07-Jan-20 08:38 AM
確かに。
AnySequenceとかと違って
謎挙動が組み込まれてる事を
表明してほしかったな
Avatar
yyu 17-Jan-20 07:07 PM
@swiftbot
print("hello")
Avatar
swiftbot BOT 17-Jan-20 07:07 PM
Author icon yyu
print("hello")
Version:
swift-5.1.3-RELEASE
Output:
hello
Error:
Avatar
yyu 17-Jan-20 07:07 PM
@swiftbot
struct Cont<A, B> { var run: ((A) -> B) -> B var flatMap: (A) -> Cont<A, B> { get { fatalError() } _modify { let that = self var me: (A) -> Cont<A, B> = { (a: A) -> Cont<A, B> in that } yield &me let tmp = { (k: (A) -> B) -> B in that.run({ (a: A) -> B in me(a).run(k) }) } run = tmp } } } var a = Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(1) } ) a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 1000) } ) } a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 2000) } ) } a.run( { (a: Int) in print(a) return a } )
Avatar
swiftbot BOT 17-Jan-20 07:07 PM
Author icon yyu
struct Cont<A, B> { var run: ((A) -> B) -> B var flatMap: (A) -> Cont<A, B> { get { fatalError() } _modify { let that = self var me: (A) -> Cont<A, B> = { (a: A) -> Cont<A, B> in that } yield &me let tmp = { (k: (A) -> B) -> B in that.run({ (a: A) -> B in me(a).run(k) }) } run = tmp } } } var a = Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(1) } ) a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 1000) } ) } a.flatMap = { (x: Int) -> Cont<Int, Int> in Cont<Int, Int>( run: { (k: (Int) -> Int) -> Int in k(x + 2000) } ) } a.run( { (a: Int) in print(a) return a } )
Version:
swift-5.1.3-RELEASE
Output:
3001
Error:
/usercode/main.swift:31:3: warning: result of call to function returning 'Int' is unused a.run( { (a: Int) in ^ ~~~~~~~~~~~~~~~
Avatar
freddi 20-Jan-20 02:11 AM
takasekさんがツイートしてたリンクで知ったんですけど、yieldが複数あるかのチェックってSILOptimizerのPassで診断してるんですね
$ swiftc yield.swift -emit-sil Run module pass #0, stage Guaranteed Passes, pass 0: SILGenCleanup (silgen-cleanup) Start function passes at stage: Guaranteed Passes Run #1, stage Guaranteed Passes, pass 1: DiagnoseInvalidEscapingCaptures (diagnose-invalid-escaping-captures), Function: $s5yield4NekoC4_bow33_BFC072E4B657A1986E9E174ACA620350LLSSvpfi Run #2, stage Guaranteed Passes, pass 2: DiagnoseStaticExclusivity (diagnose-static-exclusivity), Function: $s5yield4NekoC4_bow33_BFC072E4B657A1986E9E174ACA620350LLSSvpfi Run #3, stage Guaran # 中略 Run #135, stage Guaranteed Passes, pass 20: YieldOnceCheck (yield-once-check), Function: $s5yield4NekoC3bowSSvM yield.swift:9:13: error: accessor must not yield more than once yield &_bow ^ yield.swift:8:13: note: previous yield was here yield &_bow ^ Run #136, stage Guaranteed
(edited)
This pass is based on the existing SIL verifier checks but diagnoses only those errors that can be introduced by programmers. rdar://43578476
Avatar
omochimetaru 20-Jan-20 02:14 AM
initのフィールド初期化とか、
ownershipとか
遷移が絡む静的検証は
型推論じゃなくてSILPassにある気がする
❤️ 1
Avatar
rintaro 22-Jan-20 10:47 PM
The Swift project has achieved a critical milestone of maturity of the core fundamentals, providing stability for users to invest in using Swift in earnest. On Apple's platforms such as macOS and iOS, the arrival of ABI and module stability has enabled the creation of stable...
💖 1
Avatar
omochimetaru 23-Jan-20 01:36 AM
あ、こっちにも投稿されてたの今気づいた。
Avatar
omochimetaru 24-Jan-20 03:04 AM
@omochimetaru アプリターゲットのソースでも generic argumentに任意のprotocolが対応しているクラスを、その任意のprotocolを自身に対応させてサブクラスにしたクラス を一定数以上定義するとiOS13の実機とシミュ...
Avatar
tarunon 24-Jan-20 03:07 AM
やばw
一定数超えるとというところがやばい
Avatar
omochimetaru 24-Jan-20 03:16 AM
723で死んだ
なんかメタデータの構造上の上限数を超えてしまうのかな
Avatar
omochimetaru 24-Jan-20 03:31 AM
なんかスタックトレースがおかしいんだよな。
type metadata accessor for ObjectN のなかで type metadata accessor for Object(N+1) を呼んでるのがずっと繋がってる
Avatar
masakihori 29-Jan-20 07:16 AM
こっちに書いてみる
末尾再帰版だとインライン化されてる?
func factorial(of n: Int) -> Int { func f(_ n: Int, _ r: Int) -> Int { n <= 1 ? r : f(n - 1, r * n) } return f(n, 1) }
Avatar
masakihori 29-Jan-20 07:25 AM
アセンブリレベルではインライン化されてる
Avatar
koher 29-Jan-20 12:44 PM
おお、ほんとですね。
@swift-5.1.5
@inline(__always) func factorial(of n: Int) -> Int { func f(_ n: Int, _ r: Int) -> Int { n <= 1 ? r : f(n - 1, r * n) } return f(n, 1) } print(factorial(of: 5))
Avatar
swift51 BOT 29-Jan-20 12:45 PM
120
Avatar
koher 29-Jan-20 12:46 PM
↓LLVM-IR
define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr #0 { entry: ... %._value = bitcast %swift.refcounted* %13 to i64* store i64 120, i64* %._value, align 8 ... ret i32 0 }
120 まで計算されて埋め込まれてる。
Avatar
masakihori 30-Jan-20 12:38 AM
オプティマイザに消されてほしくない場合は
print(factorial(of: [5].randomElement()!))
とするといいです
Avatar
omochimetaru 30-Jan-20 01:42 AM
アトリビュートで@inline(never)付けるとか。
@optimize(none)みたいなやつもあった気がする なんだっけ
Avatar
masakihori 30-Jan-20 02:50 AM
randomElement()!は全部計算されて直値になるのは困る。この場合のようにインライン展開されているかを見たいという時に使ってます
Avatar
tarunon 03-Feb-20 01:57 AM
https://bugs.swift.org/plugins/servlet/mobile#issue/SR-11993 この間の2種類のconformはデザイン通りやでという回答がDoug Gregorから貼られてました
Avatar
omochimetaru 03-Feb-20 01:59 AM
そうかあ〜〜〜
同じ Generic<T> であっても構成する静的な経路によって T の conformance が変わるんだなあ
Avatar
koher 04-Feb-20 04:48 AM
#swift から。余談なのでこっちにリンクを。 COW Existential Buffers https://developer.apple.com/videos/play/wwdc2017/402/?time=1057
Swift 4 continues the evolution of the safe, fast, and expressive language, with better performance and new features. Learn about the new...
👀 1
Avatar
Kishikawa Katsumi 04-Feb-20 09:59 AM
let topMargin = 190 NSLayoutConstraint.activate([ contentViewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: topMargin), ...
^ こういう場合の topMargin をIntじゃなくてCGFloatに推測してくれるようにならないかな。右辺を別の行まで拡大する、みたいな。
Avatar
niw 05-Feb-20 04:33 PM
それ、implicit function ですね。Scala ならできる。
Avatar
Kishikawa Katsumi 06-Feb-20 01:13 AM
おおー、Scalaすごい。ということはSwiftでもいつかできるようになりそう。
Avatar
omochimetaru 06-Feb-20 01:16 AM
どんなscalaコードですか?
Avatar
thara 07-Feb-20 02:40 PM
Scalaのimplicit functionの例です
import scala.language.implicitConversions class A(val value: Int) {} implicit def toA(value: Int): A = new A(value) def f(x: A): Int = x.value * 2 val a = 100 val y = f(a) println(y) // 200
このとき、aの型はIntです。 暗黙的に関数が呼ばれるだけなので、型推論に影響を及ぼしているわけではないと思います。 (久しぶりにScala書きました。間違ってたらすみません)
(edited)
Avatar
omochimetaru 08-Feb-20 10:14 AM
そういう事か。 これはIntからAへの暗黙変換ができるだけで、aの利用箇所がaの型推論に影響してるわけではないから、 岸川さんの求めている事とは違うと思います。 見た目のコードは似ているけど。
Avatar
Kishikawa Katsumi 08-Feb-20 10:20 AM
なるほど。implicit functionはそういうものでしたか。 厳密には違うけど (私が想定していたのは)
let topMargin = 190 // ここの左辺の型を右辺からじゃなくて、 ...constraint(equalTo: view.topAnchor, constant: topMargin) // ここの代入から推論してくれてもいいんじゃない?
だったんですけど、
よく考えると絶対訳わからないことになるだろうから、Scalaの暗黙変換みたいなのはそれはそれでちょうどいい感じな気はします。
Swiftっぽくはない。
たぶん同じ仕組みだと
let topMargin = 190 // ここは右辺からIntと推論 topMargin) // ここでCGFloat(190) を暗黙的によぶ
ということだと思うので、厳密には違いそう。
(edited)
Avatar
omochimetaru 08-Feb-20 10:25 AM
その暗黙変換は、Intで現せるけどFloatで現せない値の場合のランタイムエラーを含むのが嫌だなあ
Avatar
Kishikawa Katsumi 08-Feb-20 10:27 AM
いちおう私は
...constraint(equalTo: view.topAnchor, constant: 190)
これと同じ扱いにしてほしい、という考えで要するにリテラルからの場合のみ、ということになるはずなので行けると思ってるんですよね。
Avatar
omochimetaru 08-Feb-20 10:27 AM
リテラルから一発なら安全です。
Avatar
tarunon 08-Feb-20 10:27 AM
変数の宣言時に推論が効くのは良さそうですが、暗黙変換はかなり渋いですね
Avatar
Kishikawa Katsumi 08-Feb-20 10:28 AM
let x = リテラル はreadonlyだから最初に使うときまで型を保留してもたぶん問題ないのでは、、、という考えです。
Avatar
omochimetaru 08-Feb-20 10:29 AM
仕組み的には実現はできると思いますよ 今は一文ずつ型推論を完了させてるから、実装するなら書き換える場所は多いと思うけど。
Avatar
Kishikawa Katsumi 08-Feb-20 10:32 AM
まあでもうっかりCGFloat? になったりAnyになったりしそうだな。
間にprint()を追加したら型が変わった、とか。
Avatar
omochimetaru 08-Feb-20 10:34 AM
それはハマりそうw
Avatar
Kishikawa Katsumi 08-Feb-20 10:36 AM
まあでもクロージャの$0, $1の推論ってそんな感じじゃないか?って気がしてきた。
違うな。あれはパラメータの型で決まってる
そこに当てはまってるだけだ。
Avatar
omochimetaru 08-Feb-20 10:38 AM
ジェネリックな高階関数だったら、$0の型がユースサイトで決まる状況はありえます
Avatar
tarunon 08-Feb-20 10:38 AM
flatMapは結構そんな感じじゃないかな
Avatar
Kishikawa Katsumi 08-Feb-20 10:38 AM
お、そうか。
Avatar
omochimetaru 08-Feb-20 10:38 AM
ただ、あれの場合は1ぶん
Avatar
tarunon 08-Feb-20 10:38 AM
Rxのscanはかなり飛び道具なんで、推論だと激重になりますね
Avatar
omochimetaru 08-Feb-20 10:38 AM
1文だけの制約がかかりますね
Avatar
tarunon 08-Feb-20 10:39 AM
そこからイメージするとそういう機能を追加するとコンパイラが激重くんになるのは想像に難くない
Avatar
Kishikawa Katsumi 08-Feb-20 10:39 AM
確かにmapは使う方で型を決めるなあ。 なんかおもしろい。
Avatar
omochimetaru 08-Feb-20 10:42 AM
StreamとかをflatMap繋げまくってると
実質そういう状態ですね
あれは文を切らずに、逐次実行を書いてるから。
Avatar
kateinoigakukun 08-Feb-20 10:44 AM
Rustだと複数statementを跨いだ推論が効きますね
let mut v = Vec::new(); let a: u32 = 1; v.push(a);
こんな感じでvがVec<u32>に推論される
Avatar
tarunon 08-Feb-20 10:47 AM
Rustは継承がない分、推論のコストがそこまで高くなさそうなイメージが有る (edited)
Avatar
kateinoigakukun 08-Feb-20 10:50 AM
Swiftだと型変数が増えることでオーバーロードの候補が増えて爆発しそう
Avatar
Kishikawa Katsumi 08-Feb-20 10:51 AM
Rustのその例、使いやすそう。
Avatar
kateinoigakukun 08-Feb-20 10:51 AM
べんりです 😋
Avatar
Kishikawa Katsumi 08-Feb-20 10:52 AM
Swiftだったら何かinitに渡させよう、ってデザインするやつだ。
Avatar
kateinoigakukun 08-Feb-20 10:56 AM
こういう型情報の逆伝播って動的型付けの言語だとできないですよね。
Avatar
Kishikawa Katsumi 08-Feb-20 11:07 AM
それは言語によるんじゃない? 実際にあるかどうかと、意味があるかはわからないけど、実行するまで型の妥当性を検証しない言語でもそういう情報を持ってて最適化するとかはアリだと思う。
例えばその例でVecが外に公開されてないなら静的ディスパッチに内部的にできるとか。
Avatar
omochimetaru 08-Feb-20 11:09 AM
わかりやすい例だと
Swiftのdecodeは左辺の型から
デコード処理が変わって
Avatar
kateinoigakukun 08-Feb-20 11:09 AM
実行するまでに型を決定して静的ディスパッチにできる、ということは、もうそれはもう静的な型システムじゃないですか?
Avatar
omochimetaru 08-Feb-20 11:09 AM
その中で整数をパースしたり文字列をパースしたりなどの処理が変わるけど
そういうやつは動的型では無理ですね
あ、decodeは左辺から決まらないか。引数にメタタイプを受け取るから。
func f() -> Int { print(1); return 0 } func f() -> String { print(2); return "" } let a: Int = f()
↑こういうのは動的にやるのは無理だけど、動的言語でも事前検査してディスパッチを書き換える事はできると思う。
家庭君の言う通りその時点で静的型になってるのではって話はあるけど。
TypeScriptをコンパイルして実行されるJavaScriptは静的か?動的か?みたいな議論だと思う。
Avatar
Kishikawa Katsumi 08-Feb-20 11:17 AM
例えばObjective-C(動的片付け)で 公開しないモジュール(例えばiOSアプリ) の場合でランタイムAPIを一切使ってないなら全部静的ディスパッチにして速くすることもできる、みたいな。
Avatar
kateinoigakukun 08-Feb-20 11:22 AM
言語のspecとして静的な型システムを持たない場合でも、そのspecを超えた、処理系に依存した最適化の手法として静的にコードを事前検査して静的ディスパッチに書き換えられる。ということであればそれはそうですねー。
Avatar
Kishikawa Katsumi 08-Feb-20 11:25 AM
Objective-Cは言語仕様で決まってるから例としてはイマイチだった。
Avatar
norio_nomura 08-Feb-20 01:40 PM
そういえば、Xcode 11.4はObjective-Cでobjc_directとかを使える様になってる。 https://nshipster.com/direct/ (edited)
It’s hard to get excited when new features come to Objective-C. These days, any such improvements are in service of Swift interoperability rather than an investment in the language itself. So it was surprising to learn about a recent patch to Clang.
😍 1
同一モジュール内限定で動的ディスパッチを使わない様に出来るらしい。
Avatar
norio_nomura 08-Feb-20 01:59 PM
リリースノートに載ってないけど、@property(direct)が通る事を確認した。
Avatar
omochimetaru 10-Feb-20 08:05 AM
Neil Jonesさんが400個以上の放置PR全部に
Can one of the admins verify this patch?
ってコメントしてて通知欄が死んだ
ただでさえアイコンに顔が4つ映り込んでるのに全部これになってるから圧が凄い
Avatar
omochimetaru 10-Feb-20 08:36 AM
@theblixguy Sorry about the comments. It was a mistake with a Jenkins plugin. I am in the process of deleting all these comments.
事故だったらしい
Avatar
kateinoigakukun 10-Feb-20 08:43 AM
これ事故だったのかw wasmのPRにもコメント来てて、Neilさんarmポートやってるからwasm移植にも興味あるのかと思った。
Avatar
omochimetaru 10-Feb-20 08:43 AM
何もかもにコメントしてたよ
Avatar
koher 28-Feb-20 05:53 AM
Swift の公式ライブラリ( Numerics とか Crypto とか)って軒並み Apache License 2.0 ですけど、これらに依存する可能性を考えると自作ライブラリも Apache License 2.0 にしておいた方がいいと思いますか?サードパーティのライブラリって MIT License が多いと思うんですが・・・。 MIT にしてたけど、後から Numerics に依存したいなってときとか。 Apache < MIT で、 MIT に依存して Apache にするのはありでも、逆はダメだという認識です(これも自信がありません)。
Avatar
omochimetaru 28-Feb-20 05:54 AM
依存は再配布じゃないから関係無いのでは?
Avatar
koher 28-Feb-20 05:55 AM
依存するだけなら気にしなくていいのか。
Avatar
omochimetaru 11-Mar-20 07:16 AM
This is a rewrite of integer parsing for performance and code size. It address several major issues with the existing implementation (SR-7556), but also uses a new approach described below to achie...
すごいなこれ。
Avatar
Kishikawa Katsumi 11-Mar-20 07:34 AM
すごいですね。どういう変更なのかは大まかに読んだけど各実装(_parseUnsignedBase10の中身とか)はサッパリ分からないぞ。
Avatar
omochimetaru 11-Mar-20 07:35 AM
Notes on Approach The key idea here is using the bytes of a UInt64 in a way similarly to SIMD. When doing ASCII operations the new UTF-8 backing of Strings makes them perfectly suited for this technique. Aside from integer parsing, for example also ASCII case manipulation sees many-X speed-ups when using this approach. Example (details below): let str = 0x3132_3030_3633_3739 // ASCII "12006379" let digits = str &- 0x3030_3030_3030_3030 // Subtract "0" from every lane // … (underflow check omitted for clarity) let c = (0x7f - 9) &* 0x0101_0101_0101_0101 // Constant to check value > 9 let isAnyAbove9 = (digits &+ c) & 0x8080_8080_8080_8080 != 0
文字列バッファを1文字ずつ読むんじゃなくて、8バイト分のビットバッファとみなして、ビット演算使ってまとめて8文字ずつ処理していくと。
Avatar
nanasi 25-Mar-20 02:37 AM
5.2ではSwiftPMのリソースやバイナリ対応はまだ入っていないんですね
Avatar
niw 25-Mar-20 03:32 AM
objcから使えるようになっただけでも大進歩
Avatar
norio_nomura 27-Mar-20 09:18 AM
swift-5.2-RELEASE OSS Toolchain macOS版のシンボルインストーラのダウンロードが、途中の2048MBで止まってしまう。 (edited)
https://bugs.swift.org/browse/SR-12405 JIRAで報告したけど反応がない…
Avatar
norio_nomura 30-Mar-20 11:37 PM
swift-5.2.1-RELEASE OSS Toolchain macOS版のシンボルインストーラのダウンロードも、途中の2048MBで止まってしまう。 (edited)
Avatar
niw 30-Mar-20 11:37 PM
2GB sounds like 32bit lmitation
Avatar
norio_nomura 30-Mar-20 11:38 PM
うん。
Avatar
niw 30-Mar-20 11:38 PM
ここは日本語だった
混ざる...
Avatar
norio_nomura 30-Mar-20 11:41 PM
Jordan RoseさんがAppleを去ってから、bugs.swift.orgのトリアージがされてない印象…
Avatar
omochimetaru 02-Apr-20 08:50 AM
JRose氏えらかった
👉 1
Avatar
omochimetaru 03-Apr-20 02:46 AM
The review of SE-0281: @main: Type-Based Program Entry Points begins now and runs through April 8, 2020. Reviews are an important part of the Swift evolution process. All review feedback should be either on this forum thread or, if you would like to keep your feedback private...
@UIApplicationMain とかをユーザーが自作できるようにするやつ、急にピッチ来たと思ったら急に審査来てた。
Avatar
Kishikawa Katsumi 03-Apr-20 03:12 AM
これはいいよね。
Avatar
omochimetaru 03-Apr-20 03:18 AM
良いのかなあ。
main.swiftにいきなり書けるやつで十分に思える。
Avatar
Kishikawa Katsumi 03-Apr-20 03:22 AM
なるほど。@UIApplicationMainという仕組みはいかにも苦しいから、と思ってたけどそれもない方がシンプルかなあ。
Avatar
omochimetaru 03-Apr-20 03:25 AM
@UIApplicationMain が出てきた時、いったいどうやって起動してるのかわからなくなったから、 昔の main.m が生成されて、その中に UIApplicationMain 関数の呼び出しが普通に書いてあるやつのほうが好きだった (edited)
まあいまやMain StoryboardとかInfo.plistのScene Manifestoとか、設定ファイルで制御される物事がおおくてなんもわからんけど・・・ (edited)
Avatar
Avatar
omochimetaru 11-Apr-20 11:23 AM
@swift-nightly
func f(_ aa: Int = 0, _ bb: Int) {} f(1)
Avatar
swiftNightly BOT 11-Apr-20 11:23 AM
exit status: 1 with stderr:
<stdin>:2:4: error: missing argument for parameter #2 in call f(1) ^ , <#Int#> <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Int) {} ^
Avatar
omochimetaru 11-Apr-20 11:24 AM
↑コンパイラいじってたら見つけた。これはバグなのかなあ・・・。
省略可能な仮引数と、そうでない仮引数の間で、実引数の奪い合いを常に理想的に解決するの難しい問題になる気がする。
Avatar
koher 11-Apr-20 04:20 PM
@swift-nightly
func f(_ aa: Int = 0, _ bb: Double) {} f(1.0)
Avatar
swiftNightly BOT 11-Apr-20 04:20 PM
exit status: 1 with stderr:
<stdin>:2:3: error: missing argument for parameter #1 in call f(1.0) ^ <#Int#>, <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
koher 11-Apr-20 04:21 PM
これでもダメなのか。
ん? #1 になってる。
Avatar
rintaro 11-Apr-20 04:22 PM
お、これはバクっぽい
Avatar
koher 11-Apr-20 04:23 PM
どっちですか?両方?
Avatar
rintaro 11-Apr-20 04:24 PM
おもちさんのは理解できます。
現状の仕組み上、前方からラベル見て当てていくんだと思うんですけど、それだとおもちさんのは仕方ない感じ。
koherさんのは、それで一旦失敗して、診断で無理しちゃってる感じなのかなー?
タイプチェックと診断のロジック不一致的な。
Avatar
omochimetaru 11-Apr-20 04:34 PM
koherさんのは、fix-itsは挿入だから、同じ話では? (edited)
あ、違うのか
aa が missing なのは許されるはずか。
Avatar
koher 11-Apr-20 04:40 PM
@swift-nightly @swift-5.2.5 @swift-5.1.5
func f(_ aa: Int = 0, _ bb: Double) {} let bb: Double = 1.0 f(bb)
Avatar
swiftNightly BOT 11-Apr-20 04:40 PM
exit status: 1 with stderr:
<stdin>:4:3: error: missing argument for parameter #1 in call f(bb) ^ <#Int#>, <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
swift52 BOT 11-Apr-20 04:40 PM
exit status: 1 with stderr:
<stdin>:4:3: error: missing argument for parameter #1 in call f(bb) ^ <#Int#>, <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
swift51 BOT 11-Apr-20 04:40 PM
exit status: 1 with stderr:
<stdin>:4:5: error: missing argument for parameter #2 in call f(bb) ^ , <#Double#> <stdin>:1:6: note: 'f' declared here func f(_ aa: Int = 0, _ bb: Double) {} ^
Avatar
omochimetaru 11-Apr-20 04:40 PM
んんん?
Avatar
koher 11-Apr-20 04:40 PM
リテラルがややこしくしてるかと思ったけどリテラルじゃなくてもダメで、
5.1 だと #2 になってるのがさらに謎。
Avatar
omochimetaru 11-Apr-20 04:41 PM
5.1では良かったのが5.2で壊れた?
Avatar
koher 11-Apr-20 04:42 PM
ああ、 5.1 の挙動はこれでいいのか。
Avatar
omochimetaru 11-Apr-20 04:43 PM
5.1はfix constraint( new diagnostic architecture)が入ってないから
その先のタイプエラーは出ないけど
argument matchingで デフォルト付きの 1 にバインドする結果 2が引数不足でエラーなので
僕が書いたやつの5.1時代の挙動として一貫してる
Avatar
koher 11-Apr-20 04:44 PM
これって bbDouble だから省略されてるのは aa だとラベルなくても判断できるけど、エラーで正しいでいいのかな?
Avatar
omochimetaru 11-Apr-20 04:45 PM
実装としてはラベルマッチング処理においては型情報は見ないんですよ。
Avatar
koher 11-Apr-20 04:45 PM
なるほど。
Avatar
omochimetaru 11-Apr-20 04:45 PM
まあそこは言語仕様の決めの問題として悩ましい部分だとは思う。
型推論によってラベルマッチングも影響を受けたら、便利なときもあるけどわかりにくい謎現象も起きそう。
Avatar
koher 11-Apr-20 04:47 PM
trailing closure のラベル省略とか絡むと更にややこしそう・・・
Avatar
omochimetaru 11-Apr-20 04:47 PM
-debug-constraints 見ると、masterの挙動だと、 synthesize missing argument fixだけじゃなくて、allow argument to parameter type conversion mismatch fix も生成されていて
それがバグの原因になってそうだなあ。
Avatar
koher 11-Apr-20 04:47 PM
trailing closure の場合は必ず最後の引数にマッチされるからいいのか?
Avatar
rintaro 11-Apr-20 04:47 PM
@swift-nightly
func f(_ aa: Int..., _ bb: Double) {}
なのでこの制限があるんですね。
Avatar
swiftNightly BOT 11-Apr-20 04:47 PM
exit status: 1 with stderr:
<stdin>:1:22: error: a parameter following a variadic parameter requires a label func f(_ aa: Int..., _ bb: Double) {} ^
Avatar
omochimetaru 11-Apr-20 04:48 PM
その仕様、この前バグ探してたら見つけたwよく考えてある
ラベルに型推論を絡めればそういうのも許せますね。
それこそさっき言ったとおりリテラルの絡みで予想外の事が起こりそうw
Avatar
koher 11-Apr-20 04:49 PM
可変長引数もデフォルト引数も後ろの引数にしか付けれない言語多いから、 Swift は言語仕様的に何が許されてるのかよくわからなくなる。ラベルがあることもさらに挙動を複雑にしてる気がする。
Avatar
omochimetaru 11-Apr-20 04:49 PM
trailing closureも、
最後の引数がデフォルト付きの場合はその一個手前に関数にマッチできるという
謎仕様が最近入っててややこしくて
Avatar
koher 11-Apr-20 04:50 PM
それややこしそうw
Avatar
omochimetaru 11-Apr-20 04:50 PM
それを、N個に拡張するパッチを僕が作ってこの前通したんだけどそれがリグレッションを出しちゃってrevertされたとこ。 (edited)
Avatar
koher 11-Apr-20 04:51 PM
まあでもデフォルト引数をオーバーロードと考えたら trailing closure できるのもいいのか。
Avatar
omochimetaru 11-Apr-20 04:51 PM
あのリグレッションは1個の場合にも問題が起きる気がするんだけどなあ〜
Avatar
rintaro 11-Apr-20 04:51 PM
あれをリグレッションというのは酷な感じでしたね。
Avatar
omochimetaru 11-Apr-20 04:52 PM
今、沼ってるやつを通したら再チャレンジするつもり。
Avatar
koher 11-Apr-20 04:52 PM
オーバーロードとデフォルト引数があるのもややこしい・・・。
Avatar
omochimetaru 11-Apr-20 04:52 PM
まあでもデフォルト引数をオーバーロードと考えたら
このあたりを今いろいろ考えてるんですけど
オーバーロードと考える場合は、まさに、型推論システムに投げる事になるんすよね。
考えると言うか、実際にオーバーロードで書いた場合は。
Avatar
rintaro 11-Apr-20 04:53 PM
パフォーマンス出すのが大変そう。
Avatar
omochimetaru 11-Apr-20 04:53 PM
で、オーバーロードしないで、デフォルト値を使った場合は、 型推論絡めずに静的に解くので
オーバーロードだとマッチできるけどデフォルト値だとできないようなケースがあるかも。 (edited)
てか今話題になってるやつがまさにそうだ。
Avatar
koher 11-Apr-20 04:54 PM
それって実装都合でそうなってるって話?
Avatar
omochimetaru 11-Apr-20 04:54 PM
そこまではわかんないです。
特に文書とかは心当たりない。
「オーバーロードは型推論だけど、似たような事をできるデフォルトパラメータと可変長パラメータについては、推論器使わないで静的にやる」のが設計思想なのかたまたま今そうなのかは気になりますね。
Avatar
rintaro 11-Apr-20 04:56 PM
@swift-nightly
func f(_ aa: Int = 0, _ bb: Int) { print(1) } func f(_ bb: Int) { print(2) } f(1)
Avatar
omochimetaru 11-Apr-20 04:56 PM
パフォーマンス気にしてそうなってそうな気はするけど。
Avatar
swiftNightly BOT 11-Apr-20 04:56 PM
2
Avatar
omochimetaru 11-Apr-20 04:56 PM
うわあ。
Avatar
rintaro 11-Apr-20 04:56 PM
こういうことですね。
Avatar
koher 11-Apr-20 04:57 PM
当然↓もいけた。 @swift-nightly
func f(_ bb: Double) {} func f(_ aa: Int, _ bb: Double) {} f(1.0)
Avatar
swiftNightly BOT 11-Apr-20 04:57 PM
no output
Avatar
omochimetaru 11-Apr-20 04:57 PM
aaにデフォルトつけるのは意地悪だ・・・
そうですね、そっちは自然。>koherの方
Avatar
koher 11-Apr-20 04:58 PM
さっきので func f(_ aa: Int = 0, _ bb: Int) { print(1) } にはマッチしないんだから、 func f(_ bb: Int) が選ばれるのは自然なんじゃないの?
Avatar
omochimetaru 11-Apr-20 04:59 PM
そうですね。 func f(_ aa: Int = 0, _ bb: Int) にマッチしないのがバグだとみなすなら、意地悪だなと思いました。 (edited)
または、koherの言うように「デフォルトパラメータはオーバロードと考える」のであれば、変な並びになる。
func f(_ aa: Int = 0, _ bb: Int) {} // ↑が↓のオーバーロードを意味していると捉えるなら func f(_ bb: Int) {} func f(_ aa: Int, _ bb: Int) {} // 並べるなら下つじゃないと変。
(edited)
Avatar
koher 11-Apr-20 05:01 PM
@swift-nightly
func f(_ aa: Int, _ bb: Int = 0) { print(1) } func f(_ bb: Int) { print(2) } f(1)
Avatar
swiftNightly BOT 11-Apr-20 05:01 PM
2
Avatar
koher 11-Apr-20 05:02 PM
↑は ambiguous にはならないの?
Avatar
omochimetaru 11-Apr-20 05:02 PM
デフォルトパラメータが発動すると?含まれてると?オーバーロード優先度が下がる (edited)
Avatar
koher 11-Apr-20 05:03 PM
そうなのか。
Avatar
omochimetaru 11-Apr-20 05:03 PM
マニアックw
Avatar
koher 11-Apr-20 05:03 PM
何が仕様で何が実装の結果なのか・・・。これは仕様?
Avatar
omochimetaru 11-Apr-20 05:03 PM
そのへんも文書は見たことない気がするなあ
Avatar
rintaro 11-Apr-20 05:03 PM
それは明に実装されているので、仕様と言っていいと思います。
Avatar
koher 11-Apr-20 05:04 PM
なるほど。ドキュメントにはなってなくても、意図的にそうしてるってことですね。
Avatar
rintaro 11-Apr-20 05:04 PM
typecheck の細かい仕様は文書化されてないと思います。
Avatar
omochimetaru 11-Apr-20 05:05 PM
前フォーラムで、細かいところを文書化して固定しちゃうと、改善もしにくくなっちゃう、ってコアチームの誰かが書いてたと思う
なんか、コントリビューションを盛り上げるためにももっと内部の説明があったほうがよいのでは、みたいな意見に対して。
comparing solutions 1 and 0 Comparing declarations func f(_ bb: Int) { } and func f(_ aa: Int, _ bb: Int = 0) { } (isDynamicOverloadComparison: 0) (found solution 0 0 0 0 0 0 0 0 0 0 0 0 0) comparison result: better Comparing declarations func f(_ aa: Int, _ bb: Int = 0) { } and func f(_ bb: Int) { } (isDynamicOverloadComparison: 0) comparison result: not better comparing solutions 1 and 0
↑さっきのやつ。スコアは同じで comparing declarationが出てくる。
「意図的」ってのは良い概念ですね、そう言えばいいのか。
Avatar
koher 11-Apr-20 05:09 PM
これは許されてなかった。 @swift-nightly
protocol P { func f(_: Int) func f(_: Int, _: Int) } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42)
Avatar
swiftNightly BOT 11-Apr-20 05:10 PM
exit status: 1 with stderr:
<stdin>:6:8: error: type 'S' does not conform to protocol 'P' struct S: P { ^ <stdin>:2:10: note: protocol requires function 'f' with type '(Int) -> ()'; do you want to add a stub? func f(_: Int) ^
Avatar
koher 11-Apr-20 05:10 PM
まあ当たり前か。
Avatar
omochimetaru 11-Apr-20 05:10 PM
ww
いや、当たり前じゃないかも?
Avatar
koher 11-Apr-20 05:11 PM
P は witness table に二つのエントリーを必要とするけど、 S の実装では一つにしかならないんじゃない?
Avatar
omochimetaru 11-Apr-20 05:11 PM
@swift-nightly
protocol P { func f(a: Int) } struct S: P { func f(a: Int, b: Int = 0) {} }
Avatar
swiftNightly BOT 11-Apr-20 05:11 PM
exit status: 1 with stderr:
<stdin>:4:8: error: type 'S' does not conform to protocol 'P' struct S: P { ^ <stdin>:2:8: note: protocol requires function 'f(a:)' with type '(Int) -> ()'; do you want to add a stub? func f(a: Int) ^
Avatar
omochimetaru 11-Apr-20 05:11 PM
そもそもこれが通らないんだ。
@swift-nightly
protocol P { func f(a: Int) func f(a: String) } struct S: P { func f<T>(a: T) {} }
Avatar
swiftNightly BOT 11-Apr-20 05:11 PM
no output
Avatar
omochimetaru 11-Apr-20 05:12 PM
一つのエントリで複数のrequirementsをconformするのは許されてるんですよ。
Avatar
koher 11-Apr-20 05:12 PM
えー、それいいの?
まじか・・・
Avatar
omochimetaru 11-Apr-20 05:12 PM
これはめっちゃいい技ですよ。
visitor patternと組み合わせると任意の型階層で共通実装を提供できる
デフォルト引数を使ってprotocol実装できてもいいじゃんって話題最近見たな。
Avatar
koher 11-Apr-20 05:14 PM
@swift-nightly
protocol P { func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42)
Avatar
swiftNightly BOT 11-Apr-20 05:14 PM
1
Avatar
koher 11-Apr-20 05:14 PM
順位がひっくり返った。
Avatar
omochimetaru 11-Apr-20 05:14 PM
で、とりあえず仕様を整理しようぜってmanifesto書いてる人がいる https://forums.swift.org/t/protocol-witness-matching-mini-manifesto/32752
Hello Swift community, I have been working on a "mini-manifesto" whose aim is to set out basic design principles around protocol witness matching and get some agreement from the Swift community on it. One of the reasons why is because I am currently pitching a new form of wit...
うわあ・・・w
Avatar
rintaro 11-Apr-20 05:15 PM
複数エントリで一つのrequirementはthunkで頑張ればなんとかなるかもしれないけど、前提としてこれが必要な気がする。 https://forums.swift.org/t/idea-question-default-arguments-vs-abi-vs-code-size/10823
The current ABI for default arguments generate explicit functions for each default argument in a function. As a simple example, when you call something like this: // In the defining module. func foo(a: Int, b: Int = 42, c: Float = 3.14) { ... } // On the caller side. foo...
Avatar
omochimetaru 11-Apr-20 05:16 PM
静的なSのメソッドの方が優先してるのかな?
Pの方はprotocol upcast?が居る?
Avatar
koher 11-Apr-20 05:17 PM
@swift-nightly
protocol P { func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42) let p: P = s p.f(42)
Avatar
swiftNightly BOT 11-Apr-20 05:17 PM
1 2
Avatar
omochimetaru 11-Apr-20 05:17 PM
thunkで頑張るが自然だと思うけどその場合もこれ要ります?
あいや、あれ?
ああ、前半は現状挙動で、このスレにテーマは optional にコンパイルする別方式か。
Avatar
rintaro 11-Apr-20 05:19 PM
です。ABI破壊なのでもう無理ですね。
Avatar
koher 11-Apr-20 05:20 PM
@swift-nightly
protocol P { func f(_: Int) func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42) let p: P = s p.f(42)
Avatar
swiftNightly BOT 11-Apr-20 05:20 PM
1 2
Avatar
koher 11-Apr-20 05:20 PM
↑これでも 1 になるの?
Avatar
omochimetaru 11-Apr-20 05:21 PM
上と下で変わってるからそれで良さそう
Avatar
koher 11-Apr-20 05:21 PM
↓は当然両方 3 になる。 @swift-nightly
protocol P { func f(_: Int) func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(2) } } struct S: P { func f(_ aa: Int) { print(3) } func f(_ aa: Int, _ bb: Int = 0) { print(1) } } let s: S = S() s.f(42) let p: P = s p.f(42)
Avatar
swiftNightly BOT 11-Apr-20 05:21 PM
3 3
Avatar
koher 11-Apr-20 05:26 PM
@swift-nightly
class C1 { func f(_ aa: Int) { print(1) } func f(_ aa: Int, _ bb: Int) { print(2) } } class C2: C1 { override func f(_ aa: Int, _ bb: Int = 0) { print(3) } } let c2: C2 = C2() c2.f(42) let c1: C1 = c2 c1.f(42)
Avatar
swiftNightly BOT 11-Apr-20 05:26 PM
1 1
Avatar
omochimetaru 11-Apr-20 05:26 PM
Comparing declarations func f(_ aa: Int) { } and func f(_ aa: Int, _ bb: Int = 0) { } (isDynamicOverloadComparison: 0) comparison result: not better Comparing declarations func f(_ aa: Int, _ bb: Int = 0) { } and func f(_ aa: Int) { } (isDynamicOverloadComparison: 0) comparison result: better comparing solutions 0 and 1
↑ここだけみると逆に見えちゃうけど
--- Solution #0 --- locator@0x7fd8578d8e00 [DeclRef@b.swift:15:3] with b.(file).main(a:).a@b.swift:14:11 as a: S --- Solution #1 --- locator@0x7fd8578d8e50 [UnresolvedDot@b.swift:15:5 -> member] with b.(file).P extension.f@b.swift:7:8 as S.f: (Int) -> () Opened types: locator@0x7fd8578d8e50 [UnresolvedDot@b.swift:15:5 -> member] opens τ_0_0 -> $T4
↑ここからの推測で
P.f の呼び出しは実際には func f<Self>(self: Self, _ aa: Int) の呼び出しだから (edited)
「ジェネリックな方が弱い」が効いてるんじゃないかしら
Avatar
koher 11-Apr-20 05:29 PM
クラスの継承だと順位が変わった。
Avatar
omochimetaru 11-Apr-20 05:30 PM
(-debug-constraints の comparing declarationsはログもっと出てほしいな
ほんとだw
継承はプロトコルと違って見えないジェネリックパラメータSelfが無いからじゃないかしら?w
Avatar
rintaro 11-Apr-20 05:32 PM
ところで comparing declaration で (-1|0|+1) を返すのでは無くわざわざ二回比較しているのは何故なんだろう?
Avatar
koher 11-Apr-20 05:33 PM
対応がわかりづらかったのでワンソースにして、 print する値もそろえてみた。 @swift-nightly
protocol P { func f(_: Int) func f(_: Int, _: Int) } extension P { func f(_ aa: Int) { print(1) } } struct S: P { func f(_ aa: Int, _ bb: Int = 0) { print(2) } } let s: S = S() s.f(42) let p: P = s p.f(42) ////////////////////// class C1 { func f(_ aa: Int) { print(1) } func f(_ aa: Int, _ bb: Int) { print(999) } } class C2: C1 { override func f(_ aa: Int, _ bb: Int = 0) { print(2) } } let c2: C2 = C2() c2.f(42) let c1: C1 = c2 c1.f(42)
Avatar
swiftNightly BOT 11-Apr-20 05:33 PM
2 1 1 1
Avatar
omochimetaru 11-Apr-20 05:33 PM
あ〜、なんで2回比較してるのか謎だったけど == の場合を見たいからか。
で、rintaroさんの言ってるのは最初から 3値論理で実装したら良いじゃんって事か。
2値のほうが実装がミスしにくいからじゃないですかね?
💡 1
でもパフォーマンスのこと考えるなら、3値にしたほうがよいですよね。
@swift-nightly
func f(_ aa: Int..., bb: String = "", _ cc: Double) {} func main(i: Int, d: Double) { f(i, i, i, d) }
Avatar
swiftNightly BOT 11-Apr-20 05:41 PM
exit status: 1 with stderr:
<stdin>:4:9: error: missing argument for parameter #3 in call f(i, i, i, d) ^ , <#Double#> <stdin>:1:6: note: 'f(_:bb:_:)' declared here func f(_ aa: Int..., bb: String = "", _ cc: Double) {} ^ <stdin>:4:14: error: cannot convert value of type 'Double' to expected argument type 'Int' f(i, i, i, d) ^ Int( )
Avatar
omochimetaru 11-Apr-20 05:41 PM
↑可変長の後にラベル付きが必要だけど、かりにそこにデフォルトを与えた場合でも、当然期待通りには動かないな。
でも呼び出しが通るとするなら、最後の d だけ #3 に対応させるしか無いはず。
Avatar
rintaro 11-Apr-20 05:44 PM
func f(_ aa: Int..., bb: String = "", _ cc: Double) {} は少なくとも現状は通らないようにすべきだ。
Avatar
omochimetaru 11-Apr-20 05:44 PM
ユーザーが明示的に bb: を与えて区切れるから書けても良くないですか?
Avatar
rintaro 11-Apr-20 05:45 PM
ああ、そうですね。
Avatar
omochimetaru 11-Apr-20 05:45 PM
デフォルト値が発動する事が絶対にない、という点はありますけどね。
Avatar
rintaro 11-Apr-20 05:45 PM
warning案件か。
Avatar
omochimetaru 11-Apr-20 05:45 PM
うーんたしかに。
簡単に作れそうだ。ネタ帳に書いとこ。
👍 1
Avatar
koher 11-Apr-20 05:47 PM
今まさに↓は普通にコンパイル通るのはいいのかと言おうとしてた。 @swift-nightly
func f(_ aa: Int = 0, _ bb: Int) {} f(1, 2)
Avatar
swiftNightly BOT 11-Apr-20 05:47 PM
no output
Avatar
koher 11-Apr-20 05:47 PM
= 0 は無駄なので警告かエラーがいいかと。
Avatar
omochimetaru 11-Apr-20 05:48 PM
あ〜そっか、それもそういう事になるのか。絶対に使われないデフォルト値
Avatar
rintaro 11-Apr-20 05:51 PM
連続する同ラベルパラメータで後方のものが非defaultedの場合? @swift-nightly
func foo(a a1: Int = 1, a a2: Int) {}
(edited)
Avatar
swiftNightly BOT 11-Apr-20 05:51 PM
no output (edited)
Avatar
omochimetaru 11-Apr-20 05:51 PM
同ラベルこわい
Avatar
Kishikawa Katsumi 11-Apr-20 05:52 PM
なるほど。Swiftの引数ってなかなか複雑なんですねえ
Avatar
omochimetaru 11-Apr-20 05:53 PM
@swift-nightly
func f(aa a1: Int = 1, aa a2: Int) {} f(aa: 2)
Avatar
swiftNightly BOT 11-Apr-20 05:53 PM
exit status: 1 with stderr:
<stdin>:2:8: error: missing argument for parameter 'aa' in call f(aa: 2) ^ , aa: <#Int#> <stdin>:1:6: note: 'f(aa:aa:)' declared here func f(aa a1: Int = 1, aa a2: Int) {} ^
Avatar
omochimetaru 11-Apr-20 05:53 PM
同じだ〜ダメだ〜
これも腐りデフォルト
@Kishikawa Katsumi そうなんですよ。今このマッチング部分を改造してるんですけど、沼が深い。
Apple主導だから成り立ってるけどC++みたいにフォーマルさが強い言語じゃあ採用できない仕様だなあと思う。
Avatar
Kishikawa Katsumi 11-Apr-20 05:54 PM
ここまでの例をみる限りは、紛らわしいのは全部エラーにしてくれる方が良い気がしますが。。。
Avatar
omochimetaru 11-Apr-20 05:56 PM
紛らわしいけど有用なものいろいろあるから線引が難しそう。
Avatar
Kishikawa Katsumi 11-Apr-20 05:56 PM
そっすね。オーバーロードは便利だし。
私はIDEがどっち呼んでるのかをちゃんと教えてくれたら複雑でも大丈夫かなと思ってるけど。。。
Avatar
omochimetaru 11-Apr-20 05:57 PM
オーバーロードやばいよなあw
この前発表してから tarunon とか iceman が @_disfavoredOverload 使っててウケる。
Avatar
Kishikawa Katsumi 11-Apr-20 06:01 PM
@_disfavoredOverload が付いてたら、それを呼ぶ側が知らない場合、こっちが呼ばれるはずだけどなぜかこっち、みたいな混乱が起こりますか?
Avatar
omochimetaru 11-Apr-20 06:01 PM
起こりますね。
てか、SwiftUIでそれがめちゃくちゃ発生してるはず。
Text("hoge") みたいな、文字列リテラルを与えたケースの優先度がひっくり返ってる
どっちが呼ばれてもなんとなくユーザーが期待した挙動になるならいいってことでもありますけど。
Avatar
Kishikawa Katsumi 11-Apr-20 06:03 PM
なるほど。やっぱり @overloadPrecedence(800) みたいなので決められるのがいいんじゃないか。
Avatar
omochimetaru 11-Apr-20 06:04 PM
そうですね、1段階だけフラグがあるのは不自然だし。
disfavorもひっくり返っててわかりにくいし。
@favoredOverload(1) @favoredOverload(2) とかで数字が大きい方に吸い込まれるならわかりやすそう。
protocol P1 { func f(a: Int) } protocol P2 { func f(a: Double) } func main(x: P1 & P2) { x.f(a: 0) }
↑こうやって別の型から合流してくる時はその優先度数の足並みが合わせられなかったりしそう。
Avatar
Kishikawa Katsumi 11-Apr-20 06:14 PM
めっちゃ難しいな。
Avatar
omochimetaru 12-Apr-20 01:34 PM
昨日の謎現象(#2 になるやつ) はめっちゃピンポイントな特別実装がされてた。
arg[0] が type mismatch かつ call に missing arg が発生していて、 arg[1] が param[1] に convertbile な場合に
missing arg の位置を arg[1] にして diagnose して、 type mismatch を握りつぶす
というロジックが入ってる。
Avatar
koher 12-Apr-20 01:37 PM
5.1と5.2で変わったのがこれか。
Avatar
omochimetaru 12-Apr-20 01:38 PM
ああ、5.2 で入った constraint fix を使って、こういう事が実装できるようになるので、そうです。
5.1 までは もっと序盤でエラー落ちしちゃって、こういう凝った診断は出せない。
微妙だと思ったのが、↑に出てくる [0] とか [1] がハードコードで
マジで昨日のパターンのコードでしか起きない事。
Avatar
koher 12-Apr-20 01:39 PM
Avatar
omochimetaru 12-Apr-20 01:39 PM
実装時に想定しているのは、arg[0]にデフォルトが無い場合だけだったから、 (edited)
Avatar
koher 12-Apr-20 01:39 PM
このコミットはデフォルト引数関係なくて、診断のメッセージを改善するためで、
その巻き添え(?)で昨日のメッセージ変わる現象が起こったのか。
Avatar
omochimetaru 12-Apr-20 01:40 PM
バグも生まれた。
Avatar
koher 12-Apr-20 01:41 PM
[0] とか [1] がハードコードで
↓だとどうなるんだろ? @swift-nightly
func f(x: String, _ aa: Int = 0, _ bb: Double) {} f("", 42.0)
Avatar
swiftNightly BOT 12-Apr-20 01:41 PM
exit status: 1 with stderr:
<stdin>:2:3: error: missing argument for parameter 'x' in call f("", 42.0) ^ x: <#String#>, <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^ <stdin>:2:3: error: cannot convert value of type 'String' to expected argument type 'Int' f("", 42.0) ^
Avatar
koher 12-Apr-20 01:42 PM
まちがえた
@swift-nightly @swift-5.2.5 @swift-5.1.5
func f(x: String, _ aa: Int = 0, _ bb: Double) {} f(x: "", 42.0)
Avatar
swiftNightly BOT 12-Apr-20 01:42 PM
exit status: 1 with stderr:
<stdin>:2:14: error: missing argument for parameter #3 in call f(x: "", 42.0) ^ , <#Double#> <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^ <stdin>:2:10: error: cannot convert value of type 'Double' to expected argument type 'Int' f(x: "", 42.0) ^ Int()
Avatar
swift52 BOT 12-Apr-20 01:42 PM
exit status: 1 with stderr:
<stdin>:2:14: error: missing argument for parameter #3 in call f(x: "", 42.0) ^ , <#Double#> <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^ <stdin>:2:10: error: cannot convert value of type 'Double' to expected argument type 'Int' f(x: "", 42.0) ^ Int()
Avatar
swift51 BOT 12-Apr-20 01:42 PM
exit status: 1 with stderr:
<stdin>:2:14: error: missing argument for parameter #3 in call f(x: "", 42.0) ^ , <#Double#> <stdin>:1:6: note: 'f(x:_:_:)' declared here func f(x: String, _ aa: Int = 0, _ bb: Double) {} ^
Avatar
koher 12-Apr-20 01:43 PM
おおお、 #2#3 になってない・・・。
Avatar
omochimetaru 12-Apr-20 01:43 PM
そうw
起点が[1]だと発動しない。
あと・・・
@swift-5.2.5
func f(a: Int, b: String) {} f(a: "a")
Avatar
swift52 BOT 12-Apr-20 01:43 PM
exit status: 1 with stderr:
<stdin>:2:3: error: missing argument for parameter 'a' in call f(a: "a") ^ a: <#Int#>, <stdin>:1:6: note: 'f(a:b:)' declared here func f(a: Int, b: String) {} ^
Avatar
omochimetaru 12-Apr-20 01:44 PM
↑こんなひどい誤作動も・・・
Avatar
koher 12-Apr-20 01:44 PM
Avatar
omochimetaru 12-Apr-20 01:44 PM
どうみても 引数a: は渡してるのにw
コミットメッセージでは arg[0, 1] が unlabeled の場合のシナリオを書いてあるけど
そのチェックが無いですね。
Avatar
koher 12-Apr-20 01:45 PM
でも unlabeled に限らず同じラベルのときとかも同じケースなんよね?
Avatar
omochimetaru 12-Apr-20 01:45 PM
params[0]とparams[1]が同じラベル名だったときはうまく動いて見えますね。
Avatar
koher 12-Apr-20 01:47 PM
ああ、えっと、 unlabeled でないと弾くという処理にしてしまうとさっきの ab は解消されても aa は元に戻っちゃうよね?ということ。
Avatar
omochimetaru 12-Apr-20 01:47 PM
そうですね。
「params[0]とparams[1]が同じラベルだったら」
って書くと良さそうです。
👌 1
Avatar
koher 12-Apr-20 01:48 PM
これって三つ以上でも同じ問題ってないの?
Avatar
omochimetaru 12-Apr-20 01:48 PM
どういう意味ですか?
Avatar
koher 12-Apr-20 01:48 PM
今は [0][1] だけに対応が入ってるけど
[0][1] 以外でも同じ問題は起こり得るよね?それこそさっきの異なるラベルの第一引数を入れるとか。
なんで [0][1] だけ対応したんだろう?
Avatar
omochimetaru 12-Apr-20 01:50 PM
なんか、他のところ見ててもPavelさんの実装はそういうのがよくあるんですよね。 昨日話した trailing closure の右にデフォルト引数が「1個だけ」置けるとか。
これは予想ですけど
Apple内部でSwiftUIを試しに使って、わかりにくいエラーメッセージが出たら内部raderに登録されて
とりあえずそのチケットだけ潰してるんじゃなかろうか。
Avatar
koher 12-Apr-20 01:50 PM
ああ、あれ 1 個『だけ』だったのか。
Avatar
omochimetaru 12-Apr-20 01:51 PM
そう。1個だけなのは変だと思ったんで、僕が、連続してればN個置けるようにした。
ただ、他の問題との兼ね合いでまとめてリグレッションとしてrevertされた。
Avatar
koher 12-Apr-20 01:51 PM
なるほど。そういう場当たり的対応は放置すると禍根を残しそうだね・・・。
Avatar
omochimetaru 12-Apr-20 01:52 PM
Pavelさん忙しそうな雰囲気があるし
constraint fix が SwiftUI 改善の大きなテーマに位置づけられてるし
Avatar
koher 12-Apr-20 01:52 PM
リグレッションとしてrevertされた
えー。それが昨日 rintaro さんと話してたやつか。
Avatar
omochimetaru 12-Apr-20 01:52 PM
めっちゃてんてこまいなんじゃないかと予想してるw
Avatar
koher 12-Apr-20 01:53 PM
なるほど。細かいところはとりあえず暫定で潰してる感じなのか。
Avatar
omochimetaru 12-Apr-20 01:53 PM
ただこれ個人的には仮に汎用化しても微妙だと思ってて
診断メッセージが出るところだけみたらうまく動いてるんですけど
握りつぶしてメッセージをすり替えているので、 内部的には、メッセージとは異なるエラーが生成されているんですけど
それがオーバーロード選択と関係しているんですよね
だから、まあ例えば 片方の func f は エラーペナルティが2点, もう一つは エラーペナルティが3点だったとしたら、 (edited)
この仕組は後者の3点のケースで、まるで1点の状況かのように出力だけいじってるんですよ
だから、一つずつ実行すると、片方は2点、もう片方は1点の出力になるのに
オーバーロード選択させると、なぜか成績の悪い2点の方の結果がでる
という事が起こりえます。
1点に見える呼び出しが内部的には3点だからです。
昨日も書いたように本当に改善するならラベルマッチの時点で型情報が必要なので型推論の設計修正が必要で大変。
Avatar
rintaro 16-Apr-20 02:37 AM
https://github.com/apple/swift-evolution/pull/1144 複数 trailing closure がシンタックス変わって再提出されそうです。
👀 1
Avatar
omochimetaru 16-Apr-20 02:39 AM
あ!このリポジトリだけsubscribeしてなかった。そうか、先にわかるのかw
昨日 #swift で書いたけど PR30916 が気になってました。
kylemacomber has 2 repositories available. Follow their code on GitHub.
オーサーに見慣れない名前がある
Avatar
koher 16-Apr-20 02:44 AM
UIView.animate(withDuration: 0.3) { self.view.alpha = 0 } completion: { _ in self.view.removeFromSuperview() }
animations: は書かないけど completion: は書くの?
二つが対等なんじゃなくて、 animations が本体で completion は付随する処理てきなイメージなのかな?そういう場合に使う想定?
Avatar
rintaro 16-Apr-20 02:48 AM
想定としてはそうでしょうね。とはいえ、
UIView.animate(withDuration: 0.3, animation: { self.view.alpha = 0 }) { self.view.removeFromSuperview() }
も相変わらず書けるので、想定の呼び出し方を強制するものでもないですね。
😂 1
Avatar
omochimetaru 16-Apr-20 02:48 AM
なんか UIView.animate の場合は 奇跡的にその仕様でも自然に見えるな・・・
.animate( が animationの指定の部分のタイトルっぽく見えるから・・・
UIView.animate(withDuration: 0.3) animation: { self.view.alpha = 0 } completion: { _ in self.view.removeFromSuperview() }
↑こう書きたいな。
Avatar
koher 16-Apr-20 02:50 AM
うん、せめてそうなっててほしい気が・・・。
Avatar
rintaro 16-Apr-20 02:51 AM
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
tarunon 16-Apr-20 02:53 AM
Button { print("hello world") } label: { HStack { ... } }
SwiftUIだとこんな感じになるのかな
action後ろのほうが良くないかしら…
Avatar
koher 16-Apr-20 02:54 AM
action 後ろの方が良さそうに見えますね。
Avatar
omochimetaru 16-Apr-20 02:55 AM
Optionally Labeled First Trailing Closure
Avatar
koher 16-Apr-20 02:56 AM
書いてあることとは別だけど
ipAddressPublisher .sink receiveCompletion: { completion in // handle error }
() ない場合、ラベル書けると気持ち悪いですね。 < Alternatives Consideredで否定
API authors should be naming functions assuming that the argument label of the first trailing closure will be dropped.
API ガイドラインにそんなのあるんでしたっけ?
The first trailing closure drops its argument label (like today).
Name functions assuming that the argument label of the first trailing closure will be dropped.
Avatar
omochimetaru 16-Apr-20 03:00 AM
1文目おかしくない?
Avatar
koher 16-Apr-20 03:00 AM
Proposal 中で繰り返し↑が言われてるけど。
Avatar
omochimetaru 16-Apr-20 03:01 AM
todayで省略できるのはfirstじゃなくてlastじゃないのか
Avatar
koher 16-Apr-20 03:01 AM
_ にしろということかな。
Avatar
omochimetaru 16-Apr-20 03:01 AM
あ、trailing closureに限って考えた場合はtrailing closureは1個だからfirstって解釈か。
Avatar
koher 16-Apr-20 03:01 AM
ああ、そういう意味か。
今も省略できるんだから、これからも一貫性を持たせるべきってこと?
で、それに沿って名前をつけろと。
でも、並列で二つのクロージャを受けてた API とかもあるはずだし、なんかめちゃくちゃな主張な気が。
Avatar
omochimetaru 16-Apr-20 03:03 AM
ww
Avatar
koher 16-Apr-20 03:03 AM
せめて、一つ目のクロージャ引数が _ の場合だけこの機能使えるとかの方がいいんじゃないかな?
Avatar
omochimetaru 16-Apr-20 03:03 AM
明らかに変な事になるシナリオがありそうだよなあ (edited)
UIView.animate の場合は
オーバーロードが2つあって
animationしか引数を取らないやつと、
animationと、デフォルト = nil な completion を取るやつ
があるんですね。
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion API_AVAILABLE(ios(4.0)); // delay = 0.0, options = 0 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations API_AVAILABLE(ios(4.0)); // delay = 0.0, options = 0, completion = NULL
Avatar
koher 16-Apr-20 03:05 AM
そういうシナリオではうまくいくけど、すごく限定的な気が・・・。
Avatar
omochimetaru 16-Apr-20 03:05 AM
ここがポイントに思える。
ipAddressPublisher .sink() receiveCompletion: { completion in // handle error }
↑「最初のTCにラベルを付ける場合は空丸括弧が必要」
ってルールとセットで、最初のTCにラベルを任意で付けられるようにするのが
良いんじゃないかしら
Avatar
koher 16-Apr-20 03:07 AM
_ でないと trailing closure 禁止でいい気がする・・・
Avatar
omochimetaru 16-Apr-20 03:09 AM
それだと従来の UIView.animate { }  もだめになって
下位互換性がなくない?
Avatar
koher 16-Apr-20 03:10 AM
うん、ない。
今からは無理なのはわかってるけど、それの方が良かったんじゃないかって話。
Avatar
omochimetaru 16-Apr-20 03:11 AM
なるほど。
この文法の場合はラベル構文との衝突が問題になりそうだけど
プロポーザルで言及あるのかな
Avatar
koher 16-Apr-20 03:13 AM
もうここまでやるなら : も省略しちゃえば
func if(_ condition: Bool, _ body: () -> Void, else: () -> Void) { ... } if(foo) { ... } else { ... }
とかできるけど、 Swift でやることじゃないね。
(edited)
Avatar
omochimetaru 16-Apr-20 03:14 AM
ラベルの次には if とか while が来ないといけないから曖昧にならない・・・?
Avatar
koher 16-Apr-20 03:15 AM
単一の式の場合は {} 省略とかだとなんとかならないかな?
Avatar
omochimetaru 16-Apr-20 03:16 AM
今試してるけど
LABEL: { }
が今通らないな
なんかそれは超初期に検討されてたらしいですね > if else 自作
Avatar
koher 16-Apr-20 03:17 AM
式指向の言語ならこういう方向で文と式を統合するのありかもしれないけど、 Swift は文指向なので違うと思う。
Avatar
omochimetaru 16-Apr-20 03:17 AM
単一の式の場合って?
Avatar
koher 16-Apr-20 03:17 AM
ちょっと違うケースの話してたかも。 else if を↑の枠組みでどう書くか。
Avatar
omochimetaru 16-Apr-20 03:18 AM
else_if 版をオーバーロードかなあ。
Avatar
tarunon 16-Apr-20 03:18 AM
単一の式の場合はブレースを省略
TSみたいな感じかな
Avatar
koher 16-Apr-20 03:18 AM
ですね。
Avatar
omochimetaru 16-Apr-20 03:18 AM
ああ、そういうことか。
autoclosureがそれじゃない?
Avatar
koher 16-Apr-20 03:18 AM
なるほどw
いやでも {} で書きたいケースもあるから
Avatar
omochimetaru 16-Apr-20 03:19 AM
autoclosureに { } 渡せなかったっけ
Avatar
koher 16-Apr-20 03:19 AM
渡せなくなかったっけ?
Avatar
omochimetaru 16-Apr-20 03:19 AM
ほんとだ
Avatar
koher 16-Apr-20 03:19 AM
@swift-5.2.5
func foo(_ x: @autoclosure () -> Int) { print(x()) } foo { 42 }
Avatar
swift52 BOT 16-Apr-20 03:19 AM
exit status: 1 with stderr:
<stdin>:3:5: error: cannot convert value of type '() -> Int' to expected argument type 'Int' foo { 42 } ^
Avatar
omochimetaru 16-Apr-20 03:19 AM
なんか途中でだめになりませんでしたっけ?
@swift-4.0.3
func foo(_ x: @autoclosure () -> Int) { print(x()) } foo({ 42 })
(edited)
Avatar
swift40 BOT 16-Apr-20 03:20 AM
exit status: 1 with stderr:
<stdin>:2:5: error: function produces expected type 'Int'; did you mean to call it with '()'? foo({ 42 }) ^~~~~~ ()
(edited)
Avatar
koher 16-Apr-20 03:20 AM
@swift-5.2.5
func foo(_ x: @autoclosure () -> Int) { print(x()) } foo(42)
Avatar
swift52 BOT 16-Apr-20 03:20 AM
42
Avatar
omochimetaru 16-Apr-20 03:20 AM
ダメか。
Avatar
koher 16-Apr-20 03:20 AM
昔からダメで困った気がする。
Avatar
omochimetaru 16-Apr-20 03:20 AM
なるほど。
Avatar
tarunon 16-Apr-20 03:21 AM
Tを受けるAutoclosureにClosureを渡すとT=()->(Int)として解釈される、みたいなのを勘違いしてるのでは
Avatar
koher 16-Apr-20 03:21 AM
ちがったかな。困ったのは可変長引数に配列渡せないことだったかも。
Avatar
omochimetaru 16-Apr-20 03:21 AM
それかもしれん。 > T => () -> (Int) (edited)
それ全然違う話ですけど、それも困りますねw
昨日 @niw が書いてた・・・
Avatar
tarunon 16-Apr-20 03:21 AM
前もそれ勘違いして議論がぐちゃってたのを見た気がする
Avatar
koher 16-Apr-20 03:22 AM
Java では普通にできるのに、って思ったから困ったのは可変長な気がしてきた。
Avatar
omochimetaru 16-Apr-20 03:22 AM
Javaってsplatできましたっけ?
まあ新SE-0279は個人的にはありだなあ、最初のラベルの問題はあるけど
前作の カッコ変わっただけやんけ版とは全然違う
Avatar
koher 16-Apr-20 03:23 AM
うーん、まあカッコ変わっただけよりはマシかも?でもなくてもいい気がするなぁ。
Avatar
omochimetaru 16-Apr-20 03:24 AM
↑のどこみればわかりますか?
Avatar
koher 16-Apr-20 03:26 AM
引数展開じゃなくて
代わりに配列を渡せる
Avatar
omochimetaru 16-Apr-20 03:26 AM
どの例?
あこれか
String result = MessageFormat.format( "At {1,time} on {1,date}, there was {2} on planet " + "{0,number,integer}.", arguments);
え、これって、曖昧では??
配列をsplatしたのか、 可変長の要素の1番目として配列を渡したのか
わからない。
Avatar
koher 16-Apr-20 03:28 AM
型で区別できないかな?
オーバーロードがあると曖昧になりそう。
Avatar
omochimetaru 16-Apr-20 03:29 AM
<T> だったらダメそう。
[T] なのか T, T, T,... へのsplatなのかわからない。
Avatar
koher 16-Apr-20 03:29 AM
<T> はダメかもね。
Avatar
omochimetaru 16-Apr-20 03:30 AM
む、いや、もしかして
primitive型しか渡せない?
いや、Stringがあるからそんなことないか。
Avatar
koher 16-Apr-20 03:33 AM
なんか型パラと配列問題ってあった気が。
$ cat AmbiguousVarArgs.java public class AmbiguousVarArgs { public static void main(String[] args) { String[] ss = { "XYZ" }; foo(ss); } static <T> void foo(T... xs) { System.out.println(xs); } } $ javac AmbiguousVarArgs.java Note: AmbiguousVarArgs.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. $ javac -Xlint:unchecked AmbiguousVarArgs.java AmbiguousVarArgs.java:7: warning: [unchecked] Possible heap pollution from parameterized vararg type T static <T> void foo(T... xs) { ^ where T is a type-variable: T extends Object declared in method <T>foo(T...) 1 warning $ java AmbiguousVarArgs [Ljava.lang.String;@7852e922
Avatar
omochimetaru 16-Apr-20 03:38 AM
?? ↑何が出力されているんだ?
Avatar
Kishikawa Katsumi 16-Apr-20 03:42 AM
出力されてるのは String[] ss の文字列表現、に見えます。
Avatar
omochimetaru 16-Apr-20 03:43 AM
なるほど てことは配列が展開されなかったってことか。
Avatar
Kishikawa Katsumi 16-Apr-20 03:45 AM
どっちにしろ foo(T... xs) { のxsには配列が渡るんじゃないですか?
Avatar
omochimetaru 16-Apr-20 03:47 AM
あら?printlnは可変長じゃないのか。
fooの呼び出しの実験か。
Avatar
Kishikawa Katsumi 16-Apr-20 03:49 AM
あ、そっちも可変長引数ということか。 可変長引数って引き継がれるんですかね? 違うか、fooの呼び出しと、printlnの呼び出しの両方で展開されても良さそう、ということですね?
Avatar
koher 16-Apr-20 04:03 AM
printf は可変長だけど。
Avatar
Kishikawa Katsumi 16-Apr-20 04:11 AM
おお、引数は1つでオーバーロードだ。printlnはprintln(Object x) が呼ばれたんだな。
Avatar
koher 16-Apr-20 04:13 AM
一瞬 System.outPrintStream だったか自信がなくなったけど大丈夫でした。 https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out
Avatar
Kishikawa Katsumi 16-Apr-20 04:17 AM
@koher Javaのコードはどの部分があいまいに解釈されるんですか?
Avatar
koher 16-Apr-20 04:17 AM
可変長引数の一つ目と解釈されて xsString[][] になる可能性があると思います。 (edited)
いや、 Java では型パラは実行時は常に Object だからおかしいか。
xs が 第一要素に String[] が入った Object[] になるのか、 Object[] にアップキャストされた String[] になるのかの曖昧さ?
Avatar
Kishikawa Katsumi 16-Apr-20 04:25 AM
あ、なるほど。理解しました。どう解決されてるんでしょうねえ。
Avatar
koher 16-Apr-20 04:26 AM
ちなみに Java の配列は covariant なので Object[]String[] を入れられるんですけど、ミュータブルなのでぶっ壊れます。
$ cat BrokenCovariance.java import java.util.Arrays; public class BrokenCovariance { public static void main(String[] args) { String[] ss = { "XYZ" }; Object[] os = ss; // OK System.out.println(Arrays.toString(os)); os[0] = 42; // Can be compiled, but causes runtime error System.out.println(Arrays.toString(os)); } } $ javac BrokenCovariance.java $ java BrokenCovariance [XYZ] Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer at BrokenCovariance.main(BrokenCovariance.java:10)
Avatar
omochimetaru 16-Apr-20 04:28 AM
easy killだ
Avatar
Kishikawa Katsumi 16-Apr-20 04:30 AM
なるほど。これは難しいな。
Genericsを後から入れて整合性を保つのは大変なんですね。
Avatar
omochimetaru 16-Apr-20 04:31 AM
String[] to Object[] は Java1.4 でもあったんじゃないか?
< > のジェネリクスが1.5な気がする
Avatar
Kishikawa Katsumi 16-Apr-20 04:32 AM
1.4でも実行時エラーになる?
なりました。ジェネリクスは関係なかった。
配列はそもそも1種類しか入らないやつか。
ArrayList的なやつと思い込んでいた。
Avatar
koher 16-Apr-20 04:40 AM
List は use-site variance で covariant にしたら add が消えたりして上手く動くんですけどね。
Avatar
omochimetaru 16-Apr-20 04:41 AM
Use site varianceむずい
Avatar
Kishikawa Katsumi 16-Apr-20 04:45 AM
なるほど。use-site varianceっていうのは使う側がvarianceを決定できるのか。
Avatar
koher 16-Apr-20 04:46 AM
import java.util.*; public class CovariantLists { public static void main(String[] args) { { // Invariant List<String> ss = new ArrayList<>(); ss.add("XYZ"); // OK List<Object> os = ss; // compile error } { // Covariant List<String> ss = new ArrayList<>(); List<? extends Object> os = ss; // OK os.add(42); // compile error } } }
(edited)
Avatar
Kishikawa Katsumi 16-Apr-20 04:46 AM
declaration-site varianceは逆で使われる側が決定できるのかな。
Avatar
omochimetaru 16-Apr-20 04:46 AM
yes yes
Avatar
koher 16-Apr-20 04:46 AM
です。 Scala は declaration-site で、 Kotlin は両方できます。
Avatar
omochimetaru 16-Apr-20 04:46 AM
Javaのuse-site varianceが難しいねってなってC#がdeclaration-site varianceを採用した
Avatar
Kishikawa Katsumi 16-Apr-20 04:47 AM
さっき見た記事だとScalaも両方サポートしてるって書いてありました。
Avatar
koher 16-Apr-20 04:47 AM
あれ? Scala 両方できるのか。
Avatar
Avatar
koher 16-Apr-20 04:47 AM
use-site は難しいというよりも、 Java の ? extends の記法の奇抜さが良くなかった気も・・・。
Avatar
Kishikawa Katsumi 16-Apr-20 04:48 AM
Scala, on the other hand, supports both use-site variance (syntax is similar to Java, just replace <? extends T> with [_ <: T]) and declaration-site variance.
^ 書いてあったのを引用しただけ。
Avatar
omochimetaru 16-Apr-20 04:48 AM
Covariance if A is a subtype of B then: Java: L<A> is a subtype of L<? extends B> (use-site) Scala: L[A] is a subtype of L[_ <: B] (use-site) L[A] is a subtype of L[+B] (declaration-site) Contravariance if A is a supertype of B then: Java: L<A> is a subtype of L<? super B> (use-site) Scala: L[A] is a subtype of L[_ >: B] (use-site) L[A] is a subtype of L[-B] (declaration-site)
Avatar
koher 16-Apr-20 04:48 AM
Scala はよく知らないので、勝手に declaration-site だけと思ってました。
Avatar
Kishikawa Katsumi 16-Apr-20 04:48 AM
なるほど。そういう意味だとScalaはSyntaxもちょっと変えてるからちょうどいいところなのですかね。
Avatar
omochimetaru 16-Apr-20 04:48 AM
へ〜 キーワードや記号が違うだけで同じ書き方だな。
Avatar
Kishikawa Katsumi 16-Apr-20 04:49 AM
[_ <: T] 確かに extends superは難しいけど、これはわかる気がしないでもない。
たぶん < か > の方向で示すんでしょ。
Avatar
omochimetaru 16-Apr-20 04:50 AM
Scalaは _ がいろんなところで出てくるからそういう意味で受け取りやすいかもな。
Avatar
koher 16-Apr-20 04:50 AM
<, > はどっちの型が広いかですね。
Avatar
omochimetaru 16-Apr-20 04:50 AM
Javaの ? は唐突なんだよな
Avatar
koher 16-Apr-20 04:50 AM
初見で何ってなるよねw < ?
List<? super Animal> とか、 Java 書いてる人の半分は理解してないと思う。
Avatar
omochimetaru 16-Apr-20 04:51 AM
今度Scalaやってる人にあったらuse-siteどのくらい使うか聞いてみよ
Avatar
koher 16-Apr-20 04:53 AM
use-site は細かいコントールができるけど、実装側の記述が冗長になるんだよなぁ。
Avatar
Kishikawa Katsumi 16-Apr-20 05:07 AM
まあしかしScalaは比べると対称性があってわかりやすい気がするけど、記号いっぱいだし難しいことに変わりはない気もする。 Javaは単語の選択と?が難しかったな。 (edited)
Avatar
omochimetaru 16-Apr-20 05:08 AM
Scalaはジェネリクスが [ ] なのが異端で目が慣れるまでちょっと怖い
印象の問題で本質的な違いではないですが
Avatar
koher 16-Apr-20 05:24 AM
型パラと variance は人類の認知能力では辛い感はありますよね。まあでも、だからこそ型で縛ってくれないと、動的型で適当にやってたら↑の Java の配列みたいに壊せるから。
Go みたいな選択肢もあるけど。
Avatar
omochimetaru 16-Apr-20 05:25 AM
コンテナに変な型のオブジェクトが入ってるのはデバッグも難しいしなあ。
身元調査が必要になる
Avatar
koher 16-Apr-20 05:26 AM
その点、値型はこのあたりのわずらわしさから解放されてるよね。まずサブタイプないし。
Swift は Optional でサブタイプもちこんじゃったけど。
Avatar
omochimetaru 16-Apr-20 05:26 AM
サブタイプは TT? とかがあるけど
共有が無いのが良いのかな
Avatar
koher 16-Apr-20 05:29 AM
Optional 、 Union がいいのか( Kotlin, TypeScript, Python )、 Tagged Union がいいのか( Scala, Haskell )、インチキサブタイプがいいのか( Swift )、どれがいいのかずっと自分の中で結論が出てない。
Avatar
omochimetaru 16-Apr-20 05:30 AM
Rust も Tagged Union かな
Avatar
koher 16-Apr-20 05:30 AM
シンプルにやりたいことはほとんどのケースで Union なんだけど、きっちりやるなら Tagged Union だし、 Swift はいいとこ取りしようとしたけどインチキによる複雑さを持ち込んじゃったし。
Avatar
omochimetaru 16-Apr-20 05:31 AM
インチキってどの部分ですか?
サブタイピング自体は間違ってないと思うんですよね、値の集合の包含関係から考えて。
Avatar
koher 16-Apr-20 05:32 AM
Swift の Optional は tagged union だから本来 TT? には型の派生関係はないはずなんよね。
Avatar
omochimetaru 16-Apr-20 05:32 AM
いや、tagged union だろうが、tagged された some だけに対してisomophicだから
Avatar
koher 16-Apr-20 05:33 AM
Optional にだけ特別にサブタイピングを認めてる。
Avatar
tarunon 16-Apr-20 05:33 AM
無いのが正解だと思っていて、あった場合は型システムに一定の複雑さを抱えることになる
Avatar
omochimetaru 16-Apr-20 05:33 AM
特別扱いなのはそうですねえ。
Avatar
koher 16-Apr-20 05:34 AM
struct Foo<T> { case bar(T) case baz(T) }
↑の場合に、 T is Foo<T> は成り立たない。
Avatar
tarunon 16-Apr-20 05:34 AM
T と T? にサブタイプ関係を認めるのと、T? と U? (TとUはサブタイプ関係) にサブタイプ関係を認めるが同居すると、しんどくなるやつですね
Avatar
omochimetaru 16-Apr-20 05:34 AM
いや、成り立つのでは?
別に決めの問題で、射像があればいいのだから
T から Foo<T> のアップキャストは .bar(t) って例えば決めておけば
型安全性自体は壊れないと思う
タイプチェックが通るのにランタイムクラッシュするような穴があかない、という意味。 (edited)
Avatar
koher 16-Apr-20 05:35 AM
たぶんインチキの定義が違ってて、別の複雑さを持ち込まないと実現できないって意味。 (edited)
Avatar
omochimetaru 16-Apr-20 05:36 AM
サブタイピングもう一個あって
() -> () is () -> throws () があります。
Avatar
koher 16-Apr-20 05:37 AM
throws は認めざるを得ないなぁ。
Avatar
omochimetaru 16-Apr-20 05:37 AM
概念的に整理するとこれは、 T is Result<T, Swift.Error> が、 Func<A, R>R でだけ発生する
という理屈になってる。
Rustだと多分これも無いですよね。
「別の複雑さを持ち込まないと実現できない」なるほど。
その結果サブタイピングの組み合わせの問題が出てきて曖昧なケースが出るのはそうですねえ。
Avatar
tarunon 16-Apr-20 05:38 AM
throwsはthrowsとして表現されてる限りはネストしないから
正確にはuntagged unionの括りになるんじゃないかな
Avatar
koher 16-Apr-20 05:39 AM
なるほど。
Avatar
tarunon 16-Apr-20 05:39 AM
untagged unionならサブタイプ関係は成り立つでOKだと思うよ
Avatar
koher 16-Apr-20 05:40 AM
でも
Avatar
omochimetaru 16-Apr-20 05:40 AM
ネストしないから、は微妙な気が。
() throws -> Error
Avatar
koher 16-Apr-20 05:40 AM
throws E-> E が区別されてるから
tagged 的な側面もある。
Avatar
omochimetaru 16-Apr-20 05:40 AM
↑これが 例外を返すのかエラーなのか区別できるってことはtagged的
被った。
Avatar
tarunon 16-Apr-20 05:40 AM
確かに
Avatar
koher 16-Apr-20 05:41 AM
throws は tagged と untagged のあいのこなのか。
Avatar
omochimetaru 16-Apr-20 05:41 AM
仕組み的にはtagged的だけど、使えるポジションが関数型の返り値部分で1回だけって文法で制限してるから
untagged的な特徴も持っている
Avatar
koher 16-Apr-20 05:41 AM
おもしろいな。
Avatar
tarunon 16-Apr-20 05:41 AM
Optionalのサブタイプが辛いのは、ネストする性質によるところがかなり強いので
ネストが発生すると、map { $0 as T } / some(T) の優先順位を定義しなければいけなくなる (edited)
この問題はResultがサブタイプ関係を認めたと仮定すると発生するし、現行のthrowsでは発生しない
Avatar
d_date 20-Apr-20 02:27 PM
@swift-5.2.5
import Foundation struct Test: Codable { let a = 5 } struct Test2: Codable { var a = 5 } let json = """ { "a": 10 } """.data(using: .utf8)! let test = try JSONDecoder().decode(Test.self, from: json) let test2 = try JSONDecoder().decode(Test2.self, from: json) print(test.a) print(test2.a)
Avatar
swift52 BOT 20-Apr-20 02:27 PM
5 10
Avatar
d_date 20-Apr-20 02:29 PM
Codableに準拠したstructの変数をデフォルト値つきのletでかくと、decodeしても値はデフォルト値なのねという話がTwitterにあった https://twitter.com/khanlou/status/1252174018204950530?s=20 (edited)
@nicklockwood @bjhomer I expected you to be right but I have to got to say I am surprised by these results
Avatar
omochimetaru 20-Apr-20 02:30 PM
あぁ〜
@swift-5.2.5
struct S { let a: Int = 1 } S(a: 2)
Avatar
swift52 BOT 20-Apr-20 02:31 PM
exit status: 1 with stderr:
<stdin>:2:6: error: argument passed to call that takes no arguments S(a: 2) ^
Avatar
omochimetaru 20-Apr-20 02:31 PM
↑そもそもこれができないから、まあ良さそう(できる気がしてた)
Avatar
d_date 20-Apr-20 02:33 PM
Swiftの挙動としてはいいんだけど、もし他人が実装してたら気付く機構がないので、気をつけねばと思った
Avatar
omochimetaru 20-Apr-20 02:35 PM
コンパイラが警告だすと良いのかな?
でもわかってやってるときの抑制記法が必要になっちゃうな
Avatar
d_date 20-Apr-20 02:41 PM
SwiftLintで検査するのが現状コスパいいんかね
Avatar
koher 20-Apr-20 03:33 PM
let プロパティに初期値設定したらイニシャライザでも書き換えられないから JSON の値が反映されないのは仕方ないとして、 @swift-5.2.5
struct Foo { let a = 5 init(a: Int) { self.a = a } }
Avatar
swift52 BOT 20-Apr-20 03:33 PM
exit status: 1 with stderr:
<stdin>:4:16: error: immutable value 'self.a' may only be initialized once self.a = a ^ <stdin>:2:9: note: initial value already provided in 'let' declaration let a = 5 ^ <stdin>:2:5: note: change 'let' to 'var' to make it mutable let a = 5 ^~~ var
Avatar
omochimetaru 20-Apr-20 03:34 PM
それもだめなんだ タイミング的にはinitの呼び出しよりも早いのかな?
Avatar
Kishikawa Katsumi 20-Apr-20 03:34 PM
^ これは私よく怒られるやつ。
Avatar
koher 20-Apr-20 03:34 PM
↓はめっちゃ微妙な気がする。 @swift-5.2.5
import Foundation struct Foo: Codable { let a = 5 } print(String(data: try! JSONEncoder().encode(Foo()), encoding: .utf8)!)
Avatar
swift52 BOT 20-Apr-20 03:34 PM
{"a":5}
Avatar
omochimetaru 20-Apr-20 03:35 PM
@swift-5.2.5
struct A { init() { print("A.init") } } struct S { let a: A = A() init() { print("S.init") } } S()
Avatar
swift52 BOT 20-Apr-20 03:35 PM
A.init S.init
stderr:
<stdin>:12:1: warning: result of 'S' initializer is unused S() ^~~
Avatar
koher 20-Apr-20 03:35 PM
読み込みでは反映されないけど書き出される。
Avatar
omochimetaru 20-Apr-20 03:35 PM
init()の本文より先に初期値はセットされているのか。
Avatar
Kishikawa Katsumi 20-Apr-20 03:36 PM
読み込みでは反映されないけど書き出される。
^これは違和感はないですね。
Avatar
koher 20-Apr-20 03:37 PM
まあ JSON に不変の表現力がないから仕方ないのか・・・。
動的型付けで変更しちゃいけない値と同じと考えたらいいんですかね。
Avatar
Kishikawa Katsumi 20-Apr-20 03:40 PM
readonlyってやつですかねえ
Avatar
omochimetaru 20-Apr-20 03:41 PM
一応decodeだけはやって、値が違ったらエラーのほうがマシか?
Avatar
koher 20-Apr-20 03:41 PM
でもやっぱり↓は微妙じゃないですか? @swift-5.2.5
import Foundation struct Foo: Codable { let a = 5 } let json = """ {"a":2} """ let foo = try! JSONDecoder().decode(Foo.self, from: json.data(using: .utf8)!) print(String(data: try! JSONEncoder().encode(foo), encoding: .utf8)!)
(edited)
Avatar
swift52 BOT 20-Apr-20 03:41 PM
{"a":5}
(edited)
Avatar
koher 20-Apr-20 03:42 PM
デコード→エンコードしただけで違う JSON になる。
Avatar
omochimetaru 20-Apr-20 03:42 PM
それはでも、読み込めないキーがあったときは、そうなので
Avatar
koher 20-Apr-20 03:42 PM
それはキーが消えるからいいけど、
Avatar
Kishikawa Katsumi 20-Apr-20 03:43 PM
それは外部に出してる時点で違和感ないんですよね。戻らなくてもしょうがない。
^ あくまで私の感覚の話ですが。
Avatar
koher 20-Apr-20 03:44 PM
うーん、書き換わっちゃうところには違和感はありますね。だからといってどうしようもないとは思うんですけど。
Avatar
omochimetaru 20-Apr-20 03:45 PM
Currently, adding a default value to a decodable struct will always override the value, even if it appears in the original JSON. import Foundation struct User: Decodable { let id: Int let name: String = "" } let decoder = JSONDecoder() let user = try! decoder.decode(Use...
Avatar
koher 20-Apr-20 03:45 PM
let だから Codable の対象外とかもできないし。
Avatar
omochimetaru 20-Apr-20 03:45 PM
2018年5月のスレッドがあった
Avatar
koher 20-Apr-20 03:46 PM
何でも議論されてるな。
Avatar
omochimetaru 20-Apr-20 03:46 PM
話題には見覚えあった。
そうか、memberwise initializationのトピックに話が伝搬してそこで止まってそうだ。
デフォルトパラメータにletを含めるかどうかを変更しちゃうとinitのシグネチャが変わってABI互換性が保てないけど・・・
letのプロパティも含んだinitと、letのプロパティは含まないinitの両方を自動生成すれば
下位互換も保てるし、デフォルトパラメータの数が異なるから一応オーバーロードの曖昧性も無いかな・・・
あ、でも、Decodableの振る舞い自体の下位互換性がなくなるな。 (edited)
Avatar
yyu 30-Apr-20 07:07 PM
最近Swiftを書いてなさすぎてアレだったんで、ちょうど作りたいiOSアプリができたので作ってたんですが、またそれを微妙にほっぽりだして謎なことをやっていたら意外になんかこれ使えるんじゃないか(本当か?)ってものができたので、ちょっとここに宣伝させてください 🙏 https://qiita.com/yyu/items/22fd6e52267daac49f8e (edited)
はじめに Swift 5からはResultという他のプログラム言語では主にEitherとしても知られている型が入った。しかしiOSプログラミングをはじめてみると複数のエラーを同時に集めてきてUIに表示するという必要を感じるように...
👍 2
Avatar
freddi 05-May-20 08:33 AM
「関数に渡されたクロージャが必ず呼ばれることをコンパイル時に保証できるようにする」っていうやつのプロポーザルを考えてるのですが、同じようなproposalって既に出てますっけ ↓ の場合だと、mustCalledがついたクロージャは必ず呼ばれなければならない
func function(@autoclosure @mustCalled completion: () -> Void) { completion() }
もし、関数内で別の関数のクロージャ中で呼ばれないといけないときは、その別の関数のクロージャがmustCalledならコンパイル通る
func function1(@autoclosure @mustCalled completion: () -> Void) { function2 { completion() } } func function2(@autoclosure @mustCalled completion: () -> Void) { completion() }
的な(日本語怪しくてすいません)
非同期が絡むやつのcompletionとかの呼び忘れ防止になりそうかなあっておもいまして (edited)
Avatar
kenmaz 05-May-20 08:40 AM
Swift4 で引数で渡したコールバックが必ず実行されることを保証するアノテーションの提案. 前々から欲しかった機能だけど Swift4 stage2 以降までおあずけ / https://t.co/Xp8VqEZ36Y
これどうなったんだろう
Avatar
freddi 05-May-20 08:42 AM
あ、そんなのです!
すでにあるかなあとは思ってたけど本当にあった
Avatar
kenmaz 05-May-20 08:43 AM
https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160815/026288.html この辺追いかけると何か結論見つかるかもですね
Avatar
freddi 05-May-20 08:48 AM
ありがとうございます!
Avatar
freddi 05-May-20 08:59 AM
その前にもこんなのがあったっぽいですね https://github.com/apple/swift-evolution/blob/master/proposals/0073-noescape-once.md
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
d_date 07-May-20 04:43 AM
みんなでSwiftにサインアップしたら優先度があがるとかあるかな https://github.com/features/codespaces
Your instant dev environment
😋 3
Avatar
freddi 09-May-20 05:39 AM
https://gist.github.com/freddi-kit/3d055f95b3ef0c51b741b01b3dc00ae2 コンパイルにすごく時間がかかるコード見つけたんですがこれ原因なんですかね
GitHub Gist: instantly share code, notes, and snippets.
Avatar
Kishikawa Katsumi 09-May-20 05:41 AM
おもしろ
コンパイラの弱点を突いてるみたい
😆 1
Avatar
niw 09-May-20 05:42 AM
まるで @omochimetaru さんみたい
Avatar
freddi 09-May-20 05:43 AM
あ、このコードだとまだ終わる ↓ これがやばい (edited)
Avatar
niw 09-May-20 05:43 AM
ゴミを出そうw
Avatar
freddi 09-May-20 05:44 AM
昔のバイト先で書いた張り紙ですw
Avatar
niw 09-May-20 05:44 AM
tupleまわりかな...
Avatar
freddi 09-May-20 05:44 AM
ですかね、 これのせいで書いたコードが間違ってたことさえも気づかなかったです
Avatar
niw 09-May-20 05:45 AM
めっちゃ遅いw
ugh swiftcはsipってるとlldbできないのか
あ、最近のバイナリならエラーになる
2020/4/1 の nightly ではおこらないですね(たまたまもってたnightlyがこの日付だった)
Avatar
freddi 09-May-20 05:48 AM
おー
Avatar
niw 09-May-20 05:48 AM
xcodeについてるやつの問題かなぁ
そもそもswiftcがsourcekitserviceを使うんだろうか...?
Avatar
freddi 09-May-20 05:49 AM
あ、それは ↑ でのせたcommitをコンパイラしたときです
gistの方はまだ親切な(?)時間で終わりますが、commitのやつは死にます(説明不足でした) (edited)
Avatar
niw 09-May-20 05:51 AM
なるほど
nightlyで試すとどうでしょうか?
Avatar
freddi 09-May-20 05:53 AM
commitのリンクも間違えてたのでEdit nightly でためしてみまっす!
Avatar
freddi 09-May-20 08:22 AM
May-05 nightlyだと治っててさらにエラーがユーザーフレンドリーになってました (edited)
安心
これが今現在のやつで
$ swiftc bug.swift bug.swift:7:1: error: the compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これがnightly
$ swiftc bug.swift bug.swift:7:14: error: value of type 'Int' has no member '0' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:26: error: value of type '[Int]' has no member '0' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^ bug.swift:7:39: error: value of type 'Int' has no member '1' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:51: error: value of type '[Int]' has no member '1' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^ bug.swift:7:64: error: value of type 'Int' has no member '2' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:76: error: value of type '[Int]' has no member '2' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^ bug.swift:7:89: error: value of type 'Int' has no member '3' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~ ^ bug.swift:7:101: error: value of type '[Int]' has no member '3' print((value.0 == values.0) && (value.1 == values.1) && (value.2 == values.2) && (value.3 == values.3)) ~~~~~~ ^
よく読むと、前のやつはユーザーフレンドリーじゃないんじゃなくて「the compiler is unable to type-check this expression in reasonable time」だった。草 (edited)
Avatar
niw 09-May-20 08:26 AM
おお、とてもフレンドリー。
Avatar
freddi 09-May-20 08:27 AM
ウハウハな気持ちでcommitのやつnightlyでビルドしようとしたら別のところでcrashするので、今後に期待 (edited)
Avatar
niw 09-May-20 08:27 AM
w
swiftc死にがち
😆 1
Avatar
freddi 09-May-20 08:28 AM
なにがともあれ未来に希望が持てました(多分)
💯 1
Avatar
Kishikawa Katsumi 09-May-20 09:41 AM
軽い気持ちでコンパイルして終わらんなあと思ってXcode終了したけどswiftcはずっといてメモリを食い尽くしてさっきMacを再起動することになりました。
Avatar
freddi 09-May-20 12:28 PM
あ、一番やばい状況まで行った感じですね 失礼しました、「※ 注意: ビルドは自己責任で」と↑コメントに追加しておきます!mm (edited)
Avatar
koher 09-May-20 01:51 PM
まさかさっき見かけたこのツイートw https://twitter.com/___freddi___/status/1259099476905451527
知見: macはメモリ使用量がすごくなると最終的にTrackpadが暴走する
😆 1
Avatar
freddi 09-May-20 02:17 PM
それですwwww
Avatar
lovee 09-May-20 03:24 PM
自分ならここまで複雑なTupleなら先にtypealias作るかな 😅
typealias TestCase = (input: (Bit, Bit, Bit, Bit, Bit, Bit), expected: Bit) let testBitResultBit: [TestCase] = //...
💯 1
Avatar
freddi 09-May-20 04:14 PM
ほぼの脳死でやってたのでおもいつかなかった、CPUの実装が終わったらリファクタしますw
Avatar
omochimetaru 09-May-20 10:55 PM
最近コンパイラが暴走してトラックパッド効かなくなるので困るわかる
😆 1
新しく入ったGit連携機能がヤバくて
gitプロセスがめちゃくちゃ大量に立ち上がってOSが死ぬ
Avatar
niw 10-May-20 01:13 AM
fork爆弾かな
Avatar
omochimetaru 10-May-20 07:30 AM
無限に増えて続けてるのか固定数なのかはよくわかってない(アクティビティモニタがガタガタになって調べられなくなる)けど、ファイルIOが多すぎるのかなんなのか、OSがもっていかれる。 (edited)
Avatar
freddi 11-May-20 10:17 AM
ただ、この自作CPUが遅いのがビット演算をすべてenumにしてからなのかそうでないのかが知りたい。(36ページ目) (edited)
Avatar
Kishikawa Katsumi 11-May-20 10:22 AM
めっちゃすごいですね
❤️ 1
勉強になります
Boolもごく初期はEnumだったのを思い出した
確かそんな時期ありましたよね
Avatar
koher 11-May-20 11:09 AM
多分2014年に公開されたときにはすでに enum じゃなかったんですよね。
Avatar
Kishikawa Katsumi 11-May-20 11:13 AM
そんなに昔でしたか
Avatar
koher 11-May-20 11:15 AM
↑でおもちの言ってる、昔は enumcase が camelCase じゃなく CamelCase だったってのが意外と理由かもしれませんね💧
Avatar
freddi 17-May-20 04:32 AM
https://github.com/apple/swift/pull/31847 ドキュメントの修正を投げてみたんですが、PRはこんなんでいいんだろうか
What is it? Fixing unconditional_checked_cast_addr description in SIL.rst Why Looks the description of unconditional_checked_cast_addr is a little wrong. There is a $1 in the description of example...
ドキュメントの修正だけでテストも走しらせてしまったし。。。 (edited)
Avatar
omochimetaru 17-May-20 04:33 AM
説明文に$1って書いてるけど%1じゃないの?
Avatar
freddi 17-May-20 04:34 AM
あ、
修正しました 🙇 (edited)
Avatar
omochimetaru 17-May-20 04:39 AM
コミットメッセージは、その変更を表す動詞にするのが慣習だから
fixed descriptionじゃなくて、fix description of ... って文が良いと思う
Avatar
freddi 17-May-20 04:40 AM
なるほどー
Avatar
omochimetaru 17-May-20 04:40 AM
内容自体はこれであってるのかはわからん SIL文法わすれた
Avatar
freddi 17-May-20 04:43 AM
unconditional_checked_cast_addrのBNFが、 sil-instruction ::= 'unconditional_checked_cast_addr' sil-type 'in' sil-operand 'to' sil-type 'in' sil-operand ってなってるんですが、Exampleだと unconditional_checked_cast_addr $A in %0 : $@thick A to $B in $@thick B ってなってて、二番目のsil-operandがsil-typeだけになってて、 sil-operand ::= sil-value ':' sil-type のようにsil-valueがたりないですね
これもPRにかくべきか
commitメッセージ書き直してPR出し直すべきかな
Avatar
omochimetaru 17-May-20 04:45 AM
ああ、そういう形の式なのか
Avatar
freddi 17-May-20 04:46 AM
ですです
Avatar
omochimetaru 19-May-20 06:10 AM
iOS / Server / Android 案件で、iOSとServerだけSwiftでコード共有してるんだけど、Android向けも共有したくなってくる
Avatar
Kishikawa Katsumi 19-May-20 06:13 AM
前にhttps://www.scade.io/ っていうのを見ましたね。詳しくは知らないですけど。。。
Next generation native cross platform development with Swift
Avatar
omochimetaru 19-May-20 06:14 AM
お〜
フラッターみたいな感じで、専用のフレームワーク上で全部組むタイプかな
Swift上でJavaをinteropするのはGCの壁があるから無理があるけど、
Java上でSwiftをinteropする分には、弱/強参照を丸ごとGCに載せられるから
deinit は効かなくなるけど、やれんかなぁ
Avatar
Kishikawa Katsumi 19-May-20 06:21 AM
https://qiita.com/H_Crane/items/ea445c65a903c42ce86e DroidKaigi 2020が開催されていたらそれについてのセッションもあったみたい。 ベータの期間を合わせると3年以上は続いてるプロダクトみたいですね。 UIツールキットから作ってるように見えます。たぶん。
前置き この記事自体は2019年10月に書き終わっていたのですが、、、 DroidKaigi2020に応募したCFP 「Scadeを使って「Swift」で始めるAndroidアプリ開発」 が通ったため、だいぶ温めてからの公開...
Avatar
omochimetaru 19-May-20 06:22 AM
お〜。
フラッターやるんだったらDartよりSwiftがいいからスケードやりたいな。 (edited)
でもOSのAPIはそのまま使いたい。ザマリンみたいな。 (edited)
Avatar
koher 19-May-20 06:28 AM
Android NDKでSwift動かせるなら、UIをHTML/CSSにすることでそこだけそれぞれのプラットフォームでWebViewに投げる形でSwiftでアプリ作れないかなって空想したことある。
検索したら↓出てきたけど NDK で動くのは動く? https://github.com/apple/swift/blob/master/docs/Android.md
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 19-May-20 06:29 AM
動きますね。
WebViewは変な問題がいろいろ生じがちだからなあ
Avatar
koher 19-May-20 06:30 AM
じゃあかていくんのJavaScriptKit的なの挟んでSwiftで書けたりしないかなぁ。
Avatar
omochimetaru 19-May-20 06:30 AM
構成的にはReactNativeのUI層だけHTMLにしてエンジン言語だけSwiftにしたような構成に近いですね (edited)
JavaScriptKit的なの挟んでSwiftで
それはかなりReactNativeに近くなりますね あれはJSを動かしてるけどWASMを動かすことになるから
Avatar
koher 19-May-20 06:31 AM
いや、API的な話で
JavaScriptKit的なもののレイヤーでプラットフォームの差を吸収する。 (edited)
Avatar
omochimetaru 19-May-20 06:32 AM
ただ家庭君のJavaScKitもGC境界問題があるんですよね。
Avatar
koher 19-May-20 06:32 AM
AndroidだとそこでNDKでWebViewと仲介させるとか。
もしくは、UIはネイティブにしてAndoridのViewシステムをラップした層を作るかだけど、辛そう・・・。
Avatar
omochimetaru 19-May-20 06:33 AM
UIはネイティブにしてAndoridのViewシステムをラップした層を
これがReactNativeですね
UIコードまでクロスにしなくていいんですよね、個人的には
UIは無難にOSの標準のやつでいい
Avatar
koher 19-May-20 06:36 AM
うーん、個人のリソースでラッパー層作るのは無理と思ったけど、機械的に生成ならワンチャンあるかな?
まあでも用途絞ってHTML/CSSの方が実現度高そう・・・。
Avatar
omochimetaru 19-May-20 06:37 AM
HTMLならレンダラとインタラクションは既にクロスなものが搭載されてるというのはありますね
ただフラッター以前のXPlat系は、それでみんな死んできた歴史があるから・・・(PhoneGap、あとなんかと、なんか)
なんかハマるんだろうなあ
Avatar
koher 19-May-20 06:43 AM
FlutterみたいにUIも独自でクロスって方向は現実的かもしれないね。UIKit完全互換とか目指すより。
Avatar
omochimetaru 19-May-20 06:43 AM
っぽいですね。使ってる人の様子見てると、Flutterはうまくいってそう。
👀 1
Avatar
koher 19-May-20 06:44 AM
Flutterみたいないい感じのUIフレームワークでiOS/Android両対応して、かつ影響力があって信頼できるプレーヤーがそれを開発・メンテしてくれれば、Swiftでクロスプラットフォームアプリ開発の道が開ける?遠いなぁ・・・。
Avatar
omochimetaru 19-May-20 06:45 AM
Avatar
koher 19-May-20 06:45 AM
Appleはやらないだろうしなぁ。
Avatar
omochimetaru 19-May-20 06:46 AM
WWDC2020でSwiftUI for android出てくれ〜
Avatar
koher 19-May-20 06:46 AM
企業がやらなくても、オープンソースコミュニティ作でもRxSwiftくらい盛り上がれば使われるかな・・・。 (edited)
GoogleがSwiftUI for Androidの方がまだ可能性あるんじゃ?
Avatar
omochimetaru 19-May-20 06:47 AM
なるほどw じゃあGoogleIOで出てくれかw
Avatar
koher 19-May-20 06:47 AM
うんw
もういっそ Swift for Android でいいよw
Avatar
omochimetaru 19-May-20 06:48 AM
AndroidのDalvik実行モデル全部捨てていきなりネイティブアプリ起動するようになってほしい
Avatar
koher 19-May-20 06:48 AM
でもその可能性ゼロってわけじゃないと思うんだよなぁ。
Avatar
omochimetaru 19-May-20 06:50 AM
Fuchsiaはどうなったのかな
Dart, Go, Rustなどがある (edited)
Avatar
koher 19-May-20 06:51 AM
2019年6月28日 (現地時間) - GoogleはFuchsia開発者向け公式Webサイト https://fuchsia.dev/ を公開したと報道された。
https://ja.wikipedia.org/wiki/Fuchsia_(%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)
Swift for TensorFlow もいいけど、ここにも Swift のチーム突っ込んでー < Dart, Go, Rustなどがある (edited)
Avatar
kateinoigakukun 19-May-20 07:53 AM
Adds initial support for Fuchsia OS to the compiler and adds support for building for Fuchsia in the stdlib. This change also introduces lld linker support to the build system and fixes a number of...
Avatar
omochimetaru 19-May-20 07:55 AM
単に放置しすぎてcloseしたやつか
誰かやれば進みそう。
Avatar
kateinoigakukun 19-May-20 08:01 AM
その前にビルドシステム大工事が終わらないと…
Avatar
omochimetaru 19-May-20 08:09 AM
それは誰かがやれないやつ
Avatar
kateinoigakukun 19-May-20 08:11 AM
this summerに完了予定って言ってたし大丈夫
Avatar
omochimetaru 19-May-20 08:11 AM
おお。
Avatar
kateinoigakukun 19-May-20 08:12 AM
嘘だった、this summerにやるよ、としか言ってなかった https://forums.swift.org/t/separate-cmake-process-into-compiler-and-stdlib/35392/3?u=kateinoigakukun
At a high level, I think that having someone else do this would actually be a net reduction in engineering time to the team since it is an involved change that would require me to hand hold/there is additional work that would need to be done to make sure it doesn't break inter...
Avatar
koher 19-May-20 08:15 AM
hopefully get a chance to do this sometime over the summer.
できたらこの夏のどこかでやりたい(やれたらいいな)くらいのニュアンスなのかな?
Avatar
omochimetaru 19-May-20 08:16 AM
😐
Avatar
kateinoigakukun 19-May-20 08:16 AM
頼む〜〜
Avatar
masakihori 19-May-20 01:48 PM
泳げる頃には出来る奴(それはダメ (edited)
Avatar
omochimetaru 19-May-20 02:18 PM
ビルドシステムが他の人に触れないのは、cmakeがワケワカメってのもあるんですけど、 appleが内部でもってる計画があって全容が見えないので設計改修が通せないという理由が大きいです。 arm mac向けのビルドするためのパッチが内部にある説がある。
Avatar
niw 19-May-20 04:35 PM
cmakeワカメ
Avatar
freddi 21-May-20 02:58 AM
https://github.com/apple/swift-evolution/blob/master/proposals/0283-tuples-are-equatable-comparable-hashable.md Accept されたけど、Comparableはいらなくない?とおもってしまった
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
EquatableとHashableは便利だけど (edited)
Comparable への違和感がどうも抜けない
Avatar
lovee 21-May-20 03:05 AM
(1, 2)(2, 1) どう比較するんだ? 🤔
Avatar
omochimetaru 21-May-20 03:06 AM
Comparableは辞書式比較じゃないんかな?見てないが
Avatar
niw 21-May-20 03:06 AM
(1, 2) < (2, 1) ?
(1) < (1, 2) ?
Avatar
omochimetaru 21-May-20 03:06 AM
あ、
数が違うと型が違うから比較できないのかな。
Avatar
niw 21-May-20 03:07 AM
naruhodo
Avatar
omochimetaru 21-May-20 03:07 AM
Look at the first element, if they are equal move to the second element. Repeat until we find elements that are not equal and compare them.
Avatar
t.ae 21-May-20 03:07 AM
辞書順は汎用的でいいとしても、例が座標なのはいまいちな気が。
Avatar
lovee 21-May-20 03:08 AM
ですね、座標の場合完璧に破綻します
Avatar
omochimetaru 21-May-20 03:08 AM
単に同じ集合があったときに、同じ順序付けが保証されてればいいから、なんでもいいと思う。
配列をシャッフルしてからソートしたときに、何度やっても同じ結果になってほしいだけ。
Avatar
freddi 21-May-20 03:09 AM
辞書順は汎用的でいいとしても、例が座標なのはいまいちな気が。
それだ
Avatar
omochimetaru 21-May-20 03:09 AM
ちょうどこれ話してる頃忙しくてディスカッション見れてない・・・
Avatar
koher 21-May-20 03:09 AM
つい最近、例のリバーシで、盤面のbefore/afterからディスクをひっくり返す順番のアニメーションを生成するところで、方向スコアと距離スコアを作って、 (directionScore, distanceScore) でソートするってのをやった。 sort のクロージャを書かないといけなかったけど、これが使えたら書かなくて良さそう。
👍 1
Avatar
omochimetaru 21-May-20 03:10 AM
あ〜
ソート処理を書くときに優先度付けした多段キーを作るところをタプルに投げられるか。
Avatar
freddi 21-May-20 03:10 AM
そういうusecaseはあるのですね、なるほど
Avatar
koher 21-May-20 03:10 AM
うん。
Avatar
omochimetaru 21-May-20 03:10 AM
それは便利ですね。
型が混ざっててもいいのが活きるな。
配列でやろうとすると詰む時があるので。
Avatar
freddi 21-May-20 03:11 AM
座標のexample でしか見てなかったので思いつかなかった
Avatar
Kishikawa Katsumi 21-May-20 08:29 AM
パスの通ってるライブラリは自動的に補完候補に出てきて、入力するとimportも一緒に補完される、っていうの結構一般的だと思うけどXcodeは先にimportを書かないとUIViewすら補完に出てこないのは、それはそれでいいんだけど特に慣れてない人には難しいだろうなという気はする。
Avatar
omochimetaru 21-May-20 08:30 AM
言われてみれば確かに。
Avatar
freddi 21-May-20 09:23 AM
パスの通ってるライブラリは自動的に補完候補に出てきて、入力するとimportも一緒に補完される、っていうの結構一般的
はえ、そうなんですね
import 書いたらみたいに、#include かいたらでてくるイメージだった
Avatar
omochimetaru 21-May-20 09:23 AM
Javaだとそもそも
使うクラス一個ずつimport文書くから
1ファイルにimportが30行とかあるのが普通で
やってらんないからそういうふうになってそう
Avatar
freddi 21-May-20 09:24 AM
おー、たしかにそういわれると Android Studio 使ってらそういう挙動してたの思い出しました
クラス書いたら import 文出るやん!みたいな
(1年以上前なので忘れてしまっていた
Avatar
freddi 23-May-20 01:48 PM
さっき gitでswiftのmasterをpullして utils/update-checkout --clone したら 新しく https://github.com/apple/swift-driver がcloneされ始めたように見えたんですが前からなんですかね
Swift compiler driver reimplementation in Swift. Contribute to apple/swift-driver development by creating an account on GitHub.
(my 最終pull 1月くらいだった...) (edited)
Avatar
Avatar
Avatar
norio_nomura 24-May-20 10:16 AM
少し前に #swiftpm で話してましたが、SwiftPMでswift-driverを使うためですね。 https://github.com/apple/swift-package-manager/pull/2736--use-integrated-swift-driverオプションが追加されています。
Add bootstrap and build support for building the new Swift driver and importing it (as a library) into SwiftPM. Then introduce the new SwiftPM flag --use-integrated-swift-driver to enable use of th...
Avatar
freddi 24-May-20 10:22 AM
お、そうなんですね
Avatar
nanasi 26-May-20 04:00 AM
memberwise initializerの自動実装があって別ファイルでアクセスレベルだけ変更したinitializerが定義できないのが不便
Avatar
Kishikawa Katsumi 30-May-20 08:52 AM
"".data(using: .utf8) . <= ここで補完にでてくるのは`write(to:)`を選ぶと
"".data(using: .utf8) ?.write(to: savePath)
^ オプショナルの?をつけてくれるんだけどそうするとここで改行ができなくなるからコンパイルエラーになるな
(edited)
Avatar
omochimetaru 30-May-20 09:44 AM
その形ってハテナだけ上の行のお尻につけて、ドットだけ次の行に書けませんでしたっけ
Avatar
t.ae 30-May-20 09:47 AM
swiftはできるはずですね。kotlinはできない。
Avatar
omochimetaru 30-May-20 09:47 AM
あれシンタックスがどうなってるのかよくわからない
?.で一つのトークンだと思ってたら分割できるから。
Avatar
t.ae 30-May-20 09:49 AM
?が次の行にあるとコンパイルエラーか。
Avatar
Kishikawa Katsumi 30-May-20 09:53 AM
try expected .data(using: .utf8)? .write(to: loadPath)
^ これは正しい
Avatar
omochimetaru 30-May-20 09:53 AM
そう、それなんなんでしょうね。
Avatar
Kishikawa Katsumi 30-May-20 09:54 AM
エラーメッセージによると改行したのは三項演算子と解釈されてるっぽい (edited)
Avatar
omochimetaru 30-May-20 09:54 AM
ハテナが次の行にあっても良いように言語仕様を変更するのが良いのかなあ? (edited)
それとも補完でハテナを上の行末にスパッと入れるのかw
Avatar
Kishikawa Katsumi 30-May-20 09:57 AM
最終的に残す結果としてはドットが揃ってる方が良さそうだから「?」は前の行で良さそう
Avatar
omochimetaru 30-May-20 09:57 AM
左右で離れてると読みづらいと思うんです
Avatar
Kishikawa Katsumi 30-May-20 09:57 AM
カッコいいのはドットの前に?が補完されて、保存したタイミングでキュッと前の行にフォーマットされる、ってやつだな。
?.write( ... の方がベター?
Avatar
freddi 09-Jun-20 10:18 AM
Swiftにデフォで sorted ((Result, Result) -> Bool, (Element) -> Result) ほしい(他の言語にはあった気がする、忘れた) こんなかんじで、比較対象を重複して書かなくていい
// 面積でソート [CGRect()].sorted(<, { $0.width * $0.height })
(edited)
てか、なんかこれに似たようなやつってすでに有りませんでしたっけ (edited)
Avatar
omochimetaru 09-Jun-20 10:21 AM
comparableならクロージャ無しでsortできるけど
その形だと元の型を最後に取り出したいから、それは使えない
Hey everyone, I'd like to continue a discussion about sorting ergonomics that I pitched in July. (This is a refined iteration of that pitch, based on great feedback from the original thread). Today, to sort a Collection of non- Comparable elements, we write a closure that re...
❤️ 1
フォーラムに提案はあるね
NSArrayのNSSortDescriptorを使うやつが既存の似たやつかも
Avatar
freddi 09-Jun-20 10:26 AM
(フォーラム検索力強い・・・)
Avatar
omochimetaru 09-Jun-20 10:26 AM
フォーラムでスレッドを見た記憶があった。
Avatar
freddi 09-Jun-20 10:27 AM
(なるほど) NSSortDescriptorの存在しらんかったので見てみます
extension Collection { func sorted<Result: Comparable>(_ comparing: (Result, Result) -> Bool, _ data: (Element) -> Result) -> [Element] { sorted { comparing(data($0), data($1)) } } } // 面積 [CGRect()].sorted(<, { $0.width * $0.height })
とりあえず考えてみたものの単純な例を実装してみた(Comparableだけど)
(edited)
Avatar
niw 10-Jun-20 11:39 PM
try-swiftで知り合った @tarunon さんから面白い話を伺いました。 以下、Xcode 7.2.1 (7C1002)の環境での話です。 結論 どうしたらいいかわかりません。。 本題 下記のように、 エクステン...
これ毎回どうだっけってなる
Avatar
omochimetaru 10-Jun-20 11:40 PM
古い記事だ
Avatar
niw 10-Jun-20 11:40 PM
「どうしたらいいかわかりません。。」 (edited)
WWDCでもなんかこれについて喋ってる回があったんですよね
一昨年かな (edited)
Avatar
omochimetaru 10-Jun-20 11:41 PM
今はわかってるけど記事を更新してないんですよね
フォーラムでも挙動変えたいって意見は今もあるけど
だいたいコアチームがモジュール跨いでると無理だし〜とか言って話終わる
Avatar
niw 10-Jun-20 11:43 PM
w
finalじゃないclassは禁止
Avatar
omochimetaru 10-Jun-20 11:46 PM
まあprotocol requirementsがあるかどうかがディスパッチを変えるって事と
protocol methodとclass methodは別テーブルって事を
知らなきゃSwiftは書けないって事で
良いのでは〜
Avatar
niw 10-Jun-20 11:47 PM
w
内部の実装しらないとダメってのはしんどい
わかるけど。
Avatar
omochimetaru 10-Jun-20 11:48 PM
結局だいたいのものは中身を知らないと罠を踏むしカプセル化とか幻想なんじゃないかと最近思う
Avatar
niw 10-Jun-20 11:48 PM
w
それは正しい
Avatar
omochimetaru 10-Jun-20 11:49 PM
w
このトピックに関して改善点としてありえると思うのは
protocol existentialの表記方法をP から any P に変更するという仕様変更です
cat as Hogeable がアップキャストっぽく見えるけど、 実際には Hogeable の existential への格納と言ったほうが近いので
cat as any Hogeable って書いてあったらもうちょっととっかかりやすいんじゃないかなあ。
any Hogeable 型のコンテナにオブジェクトを格納するときにメソッドを埋めないといけなくてそれをどこから持ってくるかという話なので。
Java的な発想でオブジェクトという根源的な対象が存在してそこにメソッドが生えているっていうデータモデルで考えてるとハマります
Avatar
niw 10-Jun-20 11:56 PM
たしかに
Avatar
omochimetaru 11-Jun-20 12:00 AM
「メソッドを埋めるためにどこかから持ってくる」というのがSwiftのプロトコル周りの挙動のポイントの一つで
Scalaでいうと Addable の List に対して sum メソッドを定義するみたいな事をやるときに、implicit parameterで その要素の型の型クラスを持ってきますけど
Swiftのprotocol extensionでwhere Element: AdditiveArithmeticとか書いてる時はコンパイラが静的にそれをやってるんですよね。
そこで静的に解決されて、実行時に渡されてるモノがprotocol witness tableです。Scalaだとプログラマがそれを半分手動で書いてるわけですね。 (edited)
Avatar
niw 11-Jun-20 12:03 AM
ふむふむ
Avatar
omochimetaru 11-Jun-20 12:05 AM
だからScalaの型クラスを理解した後にSwiftのprotocolはそれを簡単に書けるものであるって理解すると良さそうなんだけど、 Scalaの型クラスでは扱える高カインド型が、Swiftだと存在しないのでそれはそれで話がややこしくなってしまうんだよなあ。
Avatar
niw 11-Jun-20 12:11 AM
例え話はわかりやすいけれど誤解をうむこともあるので... (edited)
Avatar
lovee 11-Jun-20 06:39 AM
初めておもちさんと知り合った記事だ 👀
Avatar
tarunon 11-Jun-20 07:25 AM
https://bugs.swift.org/plugins/servlet/mobile#issue/SR-103 かれこれ11回重複して報告されてるw
Avatar
niw 11-Jun-20 03:45 PM
おもちさんと知り合った記事...!
Avatar
koher 11-Jun-20 04:15 PM
なつかしい。おもちがtarunonさんと知り合ってずいぶん楽しそうにしてたのを思い出します。
Avatar
niw 11-Jun-20 04:16 PM
🐱 (edited)
🐱 (edited)
WWDCのチャンネルあった。そっちだった。
Avatar
tarunon 11-Jun-20 04:20 PM
NDA用のチャンネルもあります
Avatar
niw 11-Jun-20 04:21 PM
まだNDAに触れるようなことは公開されてない
フォーラムが来週からだって。
Avatar
tarunon 11-Jun-20 04:22 PM
何が出てくるかな
Avatar
niw 11-Jun-20 04:32 PM
ARMかなあ
Avatar
norio_nomura 12-Jun-20 03:36 AM
ARMなMacが来るとしたら、iOS, iPadOS, tvOSアプリがどの程度動くのだろうか。 (edited)
App Storeのバイナリがそのまま動くのかどうか。
Avatar
koher 12-Jun-20 04:07 AM
Simulator で App Store からアプリ入れられるとうれしいですね。
Avatar
niw 12-Jun-20 04:34 AM
SimulatorがリアルにSimulatorに
😆 2
Avatar
stein2nd 18-Jun-20 06:18 PM
皆様、お初にお目にかかります。 Swift3.1がリリースされる約半年前のイベントで「Swift的なイントロスペクションが登場するかもよ?」と言及してる方の記事が、Realm Academyにあったんですね。 https://academy.realm.io/posts/mobilization-roy-marmelstein-objective-c-runtime-swift-dynamic/ で。Swift5がリリースされて暫く経った今、「Mockingツールが作れそうな、Swift的な動的ディスパッチだったり、リフレクションだったり」ってのは、はて、搭載されてましたっけ? ※今、Swift化に個人的に取り組んでる「PXSourceList」には、左様な「動的ディスパッチだったり、イントロスペクションだったり」を行なってるクラスが搭載されてるので、是非、知りたいな、と思いまして。 ※該当のクラス→ https://github.com/Perspx/PXSourceList/blob/master/PXSourceList/Internal/PXSourceListDelegateDataSourceProxy.m ※記事の最後に触れていた「ObjectiveKit」ってのが、解決の糸口になるのかな???? https://github.com/marmelroy/ObjectiveKit
A new talk introducing advanced techniques with the Objective C runtime and assessing their relevance in an increasingly Swifty world.
Source List control for the Mac. Contribute to Perspx/PXSourceList development by creating an account on GitHub.
Swift-friendly API for a set of powerful Objective C runtime functions. - marmelroy/ObjectiveKit
Avatar
Kishikawa Katsumi 30-Jun-20 12:26 AM
4 as Double // fine 4 as! Double // crashes
https://oleb.net/2020/as/ これ面白かった。
The as and as? operators in Swift are more different than their similar names suggest.
💡 3
Avatar
koher 02-Jul-20 07:32 AM
foo .bar .baz
って書きますけど、 ?. のときは↓ですか?
foo? .bar? .baz
Avatar
omochimetaru 02-Jul-20 08:04 AM
ハテナを次の行に持ってくるとsyntaxの解釈が変わってだめなんすよね。
これもだめ
だからそれしかないと思ってます
👉 1
Avatar
koher 02-Jul-20 08:26 AM
なるほど。
?. が不可分じゃないのおもしろいね。 Swift 1 Swift 1 前の beta の頃はたしか ? は独立した後置演算子だったし。 (edited)
ってか foo?() とかもあるから
分けられても不思議はないのか。
foo? が廃止されただけで。
Avatar
omochimetaru 02-Jul-20 08:28 AM
?()は改行できないですけどね。
その辺の文法構造をLexer/Parserでどう扱ってるのかはよく知らない。
Avatar
koher 02-Jul-20 08:30 AM
@swift-5.2.5
let f: (() -> ())? = { print("hello") } f? ()
(edited)
Avatar
swift52 BOT 02-Jul-20 08:30 AM
hello
(edited)
Avatar
koher 02-Jul-20 08:31 AM
スペースはいけるのか。
; がない言語はそのあたりの厳密なルールの理解が難しい。
Avatar
omochimetaru 02-Jul-20 08:35 AM
そうですね
Avatar
lovee 11-Jul-20 03:33 PM
danger-swiftのgit diffパッチを取得するプラグインを作ってみたw(目標はいろんなgitとかの機能をまとめるライブラリーです) https://github.com/el-hoshino/DangerSwiftHammer
"Everything can be fixed with a hammer." - Jeremy Clarkson - el-hoshino/DangerSwiftHammer
Avatar
koher 15-Jul-20 05:56 AM
急に思い立って書いてみました。Apple環境『以外』のSwiftほぼ全部盛り。 - wasm: SwiftWasm, JavaScriptKit, Tokamak - SSS: Vapor, Leaf, Fluent - Swift AWS Lambda Runtime - Swift for TensorFlow https://qiita.com/koher/items/c738fe09a955087b436c (edited)
Swift は iOS アプリを作るための言語というイメージが強いと思います。しかし、実際にはサーバーサイドプログラムや機械学習、コマンドラインツールの開発など、 多様な目的で利用できる汎用言語です 。 2015 年にオープンソース化...
👀 1
💪 1
今日の 15 時までで「Qiita夏祭り」なるものが行われていて、「〇〇(言語)のみを使って、今△△(アプリ)を作るとしたら」というお題があったので。 https://qiita.com/official-events/5d181aadf5db26b73d33
Avatar
kateinoigakukun 15-Jul-20 07:26 AM
ここまでSwiftだけで書けるようになるとコードの共通化が捗りそうですねー
Avatar
koher 15-Jul-20 08:31 AM
モバイル、Webフロントエンド、バックエンドで共通化できたら最高ですね。Androidの壁が高いけど…。
Avatar
omochimetaru 15-Jul-20 08:32 AM
Androidェ・・・
Avatar
kateinoigakukun 15-Jul-20 08:37 AM
ちゃんと分かってないんですが、Androidの厳しいポイントはどこなんですか?
Avatar
omochimetaru 15-Jul-20 08:37 AM
Swiftコードが使えないこと
Avatar
kateinoigakukun 15-Jul-20 08:38 AM
SwiftをAndroidで動かす上で
Avatar
omochimetaru 15-Jul-20 08:38 AM
Viewとかはネイティブを使いたいからそのままSwiftを持ってきてもブリッジが大変
Avatar
kateinoigakukun 15-Jul-20 08:38 AM
JNIとかいうのを使ってどうにかならないんですか
Avatar
omochimetaru 15-Jul-20 08:39 AM
例えばモデル型があったとして、プロパティが3つあったら
Javaのクラスを書いた上で、 ctor, finalyze, propery(A|B|C) getter/setterで最低8つのブリッジJNI関数を書かないといけないし
ctor対応のnative c++でJava側のfield IDを取ってくるみたいなJNI VM経由リフレクションも書くし
Avatar
kateinoigakukun 15-Jul-20 08:41 AM
ふむー
Avatar
omochimetaru 15-Jul-20 08:41 AM
Swift型の型を受け取る/返す 関数は、その引数/返り値も全部変換をかけないといけないから
手間を考えると最初からKotlinでモデル書き直したほうがマシ
Avatar
kateinoigakukun 15-Jul-20 08:42 AM
実行モデル的に厳しいみたいな話ではないんですね
Avatar
omochimetaru 15-Jul-20 08:42 AM
書き直すといってもSwiftからコピペして、syntaxが似てるから、IDEのエラーを潰していく作業になる
あとは、そうやってポーティングするにしても、
ListとDictのコピーセマンティクスが違うから
神経を使う
Android側のパフォーマンスは犠牲にしてdefensive copyに寄せてる
自明なケースは参照共有でいいんだけど。
Avatar
kateinoigakukun 15-Jul-20 08:45 AM
その辺のJava連携のためのグルーコードを上手いこと吐いてくれるツールが欲しいな
ListとDictのコピーセマンティクスが違うから
これはどうしようもないけど
Avatar
koher 15-Jul-20 08:46 AM
Viewは諦めてModelだけ共通化した上でKotlinラッパー吐くか、共通の独自UIフレームワーク導入するかかなぁ?
Avatar
omochimetaru 15-Jul-20 08:46 AM
GC特性については、弱いSwiftを強いKotlin(JVM)に持っていく分には問題なし。
Avatar
kateinoigakukun 15-Jul-20 08:48 AM
GC境界は小細工が必要そう…
なるほどなぁ
Avatar
omochimetaru 15-Jul-20 08:49 AM
JNI境界の壁は結構厚いんだよなあ体感
Avatar
kateinoigakukun 15-Jul-20 08:49 AM
JVMのコードは抽象度が高いお陰でLLVMからコード生成するにも厳しいし… (edited)
Avatar
omochimetaru 15-Jul-20 08:50 AM
Swift(SIL)→Java トランスパイルについて何度か考えてるけど
Stringとかがtagged pointerとかのポインタ実装依存のハックとか
ビットに畳み込んだ実質enumみたいなのを使いまくってるせいで
それをJava上で表現できないんだよね
まずビットからポインタに戻す操作がJavaには存在しないし
バイト配列みたいなものを使おうとするとbyte[]が出てきてそこでオブジェクトが1段分離されてポインタが挟まっちゃう
そうすると、ストレージ領域に対するビットコピーとかの振る舞いが変わってくるから
SIL上で記述されたunsafeBitCastとかが一通りぶっ壊れて無理そうなんだよね
つまり、SILの記述レベルがJavaの抽象度よりもマシン寄りにローレベルすぎてトランスパイルできない。 (edited)
SIL実行仮想マシンみたいなものをJava上で再実装するみたいなインタプリタモデルならできるけど
まともな性能が出ないしデバッグとかできなそうだしダメ
Swift→Kotlin トランスパイルを狙って、StringとかArrayとかのstdlibで実装されたhackyなやつらは専用の再実装ライブラリに差し替えるとかならいけるかもなあ。
Swiftレベルの、unsafe系ではない操作だけだったら、ほぼほぼトランスパイルできると思うので。
Avatar
kateinoigakukun 15-Jul-20 08:55 AM
あとdeinitがだめですかね
Avatar
omochimetaru 15-Jul-20 08:55 AM
ただそっちはそっちで、protocol witness tableを渡す部分とかを陽なコードにコンパイルしなきゃいけないので、 ロジック規模がめちゃくちゃでかそう
あ〜!deinitはダメだね
deterministic resource managementなコードは死ぬ
SILレベルなら参照カウンタ操作が陽だからいけるけど
Swiftレベルからだとダメだね。
いや、結局SILレベルからでも、マップしたモジュールをjavaから触るところで retain とか呼ばなきゃいけなくなっちゃうのか・・・
共有部分だけネイティブに持っていってからJNI経由でマップしたクラスを自動生成する、っていうのが現実的なんかなあ
Avatar
kateinoigakukun 15-Jul-20 09:03 AM
C++ on Androidとかはそういう使い方なのかな
Avatar
Biacco42 15-Jul-20 11:06 AM
Java の Project Panama (JEP 191 - foreign function interface) 待ち続けて 5 年経ったけど、まぁ一筋縄では行かないなぁという感じなので難しい (edited)
Avatar
omochimetaru 15-Jul-20 11:07 AM
へー 新しいFFI仕様の提案があるのか
Avatar
koher 15-Jul-20 12:47 PM
Flutter方式がいいと思うんだよなぁ。SwiftUIより使い勝手の良い(特にレイアウト)イケてるUIライブラリを作って、それがクロスで動くようになればワンチャンあると思う。
ただ、作り手が信頼できないと流行らないだろうから、GoogleかAppleが出すとかしないときつそう。
Appleには何のメリットもなさそうだけど、GoogleはiOSエンジニアを取り込んで同時にAndroidアプリを充実させられるから、戦略的にはありだと思うんだけどなぁ。
あとはUnityがSwiftに対応するとか。
もしくは、Androidで動作するSwiftUIクローンがあればいいのかな。
Avatar
omochimetaru 16-Jul-20 01:51 AM
Scadeがその方式だけど、作り手が第三者なのでどうなの?って感じですね。 (edited)
FlutterがSwiftで書けるようになったら手っ取り早いですね。
UnityはUI系は弱いですよ。
AndroidでのSwiftUIは便利そうだけどUI以外のOS固有モジュールとのブリッジをどうするか問題は結局残りそう
Avatar
koher 16-Jul-20 01:56 AM
Unityは一般のアプリという意味じゃなくて、クロスが弱い Swift の現状打開の方向性の一つとして。
Avatar
omochimetaru 16-Jul-20 01:57 AM
ああなるほど。
Avatar
koher 16-Jul-20 01:57 AM
AndroidでのSwiftUIは便利そうだけどUI以外のOS固有モジュールとのブリッジをどうするか問題は結局残りそう
OS固有は最悪これで実装できるという穴を空けておいて、まずは UI からちょっとずつ充実させていく感じかなぁ。 Google にやってほしい・・・。
Avatar
omochimetaru 16-Jul-20 01:57 AM
Windows/Linux向けのデバッガとかが充実すればありえるかも?
Avatar
koher 16-Jul-20 01:58 AM
Google にとってメリットあると思うんだよなぁ。
Avatar
omochimetaru 16-Jul-20 01:59 AM
UnityじゃなくてもSceneKit/GameKitとかをクロスプラットフォームにしてもらうとか。
Google にやってほしい・・・。
Avatar
koher 16-Jul-20 01:59 AM
↑、 Google に、ってことか。
Avatar
omochimetaru 16-Jul-20 01:59 AM
Swift for TensorFlow チームはあるからちょっとだけ期待できますね。ちょっとだけ。
いや、Appleがやればいいと思いますけどね。
Avatar
koher 16-Jul-20 02:00 AM
Apple がやる分には Apple にとっていいことなくない? Apple のエコシステムに囲ってたものが Android 等にも広がるだけで。
Avatar
omochimetaru 16-Jul-20 02:00 AM
Swiftが普及する。
Avatar
koher 16-Jul-20 02:01 AM
Swift が普及しても Apple の利益に直結しない気がする。
Avatar
omochimetaru 16-Jul-20 02:01 AM
うーんでも
On the road to Swift 6 で
対応環境の拡充を打ち出してますよ (edited)
Avatar
koher 16-Jul-20 02:02 AM
それはオープンソース Swift のコミュニティとしての方針であって、 Apple のフレームワークである SceneKit をオープンにするかは Apple の判断だからまた別な気が。
Core Team の大半が Apple の人で、 Apple の影響は受けているにしても、 Core Team は Swift を広めていくことに積極的なマインドだと思うんよね。
でもそれは必ずしも Apple の方針とは一致しないと思っていて、 Apple にとって Swift クロス開発ができてもあまりうれしいことはなさそうだと思う。
Avatar
omochimetaru 16-Jul-20 02:04 AM
そうなんですかねえ。稼働時間が取られるわけだから、ある程度Appleの意図も反映されていると思うんですけど。
これまでもSwiftはなんだかんだAppleの意図にかなりコントロールされていたと思うし。
Avatar
koher 16-Jul-20 02:05 AM
逆に、 Microsoft が Xamarin やるのはすごい意味があって、後発でシェアも小さい中で自社プラットフォームのアプリを作ってもらうには、 iOS/Android もクロスで開発できるよというのは大きかっただろうなと。
iOS が Android に対して圧倒的不利な状況になったら Apple が iOS/Android クロス開発できるツールを作るかもしれないと思ってる。
Avatar
omochimetaru 16-Jul-20 02:07 AM
そのギャップはたしかにそうですね。
Avatar
koher 16-Jul-20 02:07 AM
ある程度Appleの意図も反映されていると思うんですけど
影響を受けてるのは間違いないと思うけど、どっちかっていうと、 Swift を作りたかった人たちが Apple をうまく利用して Swift を広めたってことだと思ってる。
FlutterSwift か SwiftUIAndroid の登場が求められるな・・・。
一方で、クロスでおもしろいと思ってるのは、 SwiftUI で iOS/macOS でクロスになるのが、これまで Electron とかで Windows/macOS クロスになってたのと対立して、 iOS/macOS をとるか Windows/macOS をとるかみたいな葛藤が生まれそう。
Avatar
niw 16-Jul-20 02:16 AM
一方日本企業は MSIE を選んだ
😂 1
Avatar
koher 26-Jul-20 02:02 AM
Apple に SwiftKit とか出してほしい。 iOS や macOS に同梱された実行時用 Swift コンパイラで、 Swift を(本来の意味での)スクリプティング言語として利用できるような。そうすればユーザーが Swift を書いて色々制御できるアプリ作れるのに。 Playgrounds アプリとか実質そうだし。言語仕様安定するまできついかなぁ。
Avatar
kateinoigakukun 26-Jul-20 04:37 AM
例えばユーザーがSwiftLintのカスタムルールをSwiftで書ける,みたいなことですか?
Avatar
koher 26-Jul-20 06:11 AM
アプリのちょっとしたカスタマイズコードを書けたり(そのアプリの機能を組み合わせて自動化するとか)、ゲームのキャラの行動をスクリプトとして書けたりというイメージです。
iOSアプリだとJavaScriptCoreを使えばJSでユーザーが書いたスクリプトを実行することはできますが、Swiftでできるようにしたいなと。
標準ライブラリに限ればファイルI/Oもネットワークもないし、ちょうどいいと思うんですよね。
Avatar
tarunon 26-Jul-20 06:16 AM
実装や言語機能の問題と言うよりは審査の問題な気もする
Avatar
koher 26-Jul-20 06:18 AM
JavaScriptCore を使ってユーザースクリプトを実行するのも、今は認められてませんっけ?主要機能を変更しなければ。
Avatar
tarunon 26-Jul-20 06:19 AM
出来るんでしたっけ?
Avatar
rinsuki 26-Jul-20 06:22 AM
Pythonista というPythonを書いて実行できるiOSアプリがあり https://apps.apple.com/jp/app/pythonista-3/id1085978097 、このアプリはdlsymがPythonから呼べるのでobjc_* を呼んで好き勝手できる(し、ObjCのクラスを呼び出すライブラリもアプリに内蔵されてる)んですが、そういうのが許されているので、(個人的な解釈ですが) Apple的にはたぶんユーザーに書かせる分には良いんじゃないかと思うんですよね
‎Pythonista is a complete scripting environment for Python, running directly on your iPad or iPhone. It includes support for both Python 3.6 and 2.7, so you can use all the language improvements in Python 3, while still having 2.7 available for backwards compatibility. In tru...
ただこれを使ってリリースしたアプリの機能をごっそり変えるみたいなのは当然怒られると思いますが。
Avatar
tarunon 26-Jul-20 06:31 AM
DLしてきて実行する、を加えると怒られるのかな。pythonも使えるのは良いですね
コンパイルせずに実行可能なswiftがあれば、これのSwift版が出来るので、それがほしいと
Avatar
niw 26-Jul-20 07:01 AM
途中で規約が変わって、こういうのは許されるとなったはず。
じゃなかったら Swift Playground はだいぶあれ。
Avatar
omochimetaru 26-Jul-20 08:20 AM
自由なコードが取ってこれるようになってなくてアプリのオーナーが提供するならセーフだったと思う
playgroundみたいに自分で書けるのはどうなんだ?
Avatar
koher 26-Jul-20 12:00 PM
DLやユーザーが書くのもOKになったんじゃなかったですっけ?アプリの中身を入れ替えてしまうようなのはアウトだけど、基本の挙動を変えない(ゲームのキャラクターの動作ロジックを書く)とかはOKと思ってました。
2.5.2 Appはバンドル内で完結している必要があります。他のAppを含め、指定されたコンテナエリア外に対するデータの読み書き、またはAppの特徴や機能を導入したり変更したりするコードをエリア外からダウンロード、インストール、実行することは許可されません。実行形式のコードの学習や開発、学生によるテストを目的とした教育用Appでは、コードが他の目的で使用されないという、限られた状況での使用に限り、コードのダウンロードが許可される場合があります。こうしたAppでは、ユーザーがApp上でソースコードの全体を確認し、編集できることを許可しておく必要があります。
https://developer.apple.com/jp/app-store/review/guidelines/
(edited)
結構厳しそう?
Avatar
koher 04-Aug-20 02:36 AM
conditional な dictionary literal ってどこかで論じられてませんでしたっけ?
let dict = [ "a": 2, "b": 3, "c": 5 if isFoo, ]
みたいなの。
Avatar
omochimetaru 04-Aug-20 02:43 AM
初めて見た
リテラルの中で #if したい みたいな話は見覚えがある
僕はそういうのやりたくなったら optional にして compactMapValues する事があります (edited)
Avatar
koher 04-Aug-20 02:47 AM
あったら便利だと思うんだけどねー。
ときどきやりたくなるから。
Avatar
omochimetaru 04-Aug-20 02:48 AM
あ〜ってか、それで困って var にして if 文で ちょこちょこ組み立てていくような
コードを良く書くな。
あったら便利な気もするけど式的なifはSwiftらしくない気もする。
Avatar
koher 04-Aug-20 02:52 AM
そうなんよね。 var にして組み立てることになる。
Function Builder ならできなくはないだろうけど・・・
Avatar
omochimetaru 04-Aug-20 02:53 AM
let dict = { var d = [:] ... return d }()
こうするとvar性の延長は避けられるか。
Avatar
koher 04-Aug-20 02:53 AM
// Function Builder let dict: [String: Int] = .init { ("a", 2) ("b", 3) if isFoo { ("c", 5) } }
(edited)
Avatar
omochimetaru 04-Aug-20 02:54 AM
できそうですねw
DictionaryはまさにドキュメントみたいなもんだしFunction Builderの使い所としても正しそう
でもタプル並べてるのがちょっと残念か・・・
Avatar
koher 04-Aug-20 02:54 AM
リテラルの拡張よりも Function Builder を使うのが現実的な道か。
もしくは Dictionary literal 並べられるといいのかな?
Avatar
omochimetaru 04-Aug-20 02:55 AM
Function builderでユーザ構成するほうが仕組みとしてはきれいだけど
見た目的にDictionary Literalらしくなくなってしまうのが微妙ですね
Avatar
koher 04-Aug-20 02:56 AM
let dict: [String: Int] = .init { [ "a": 2, "b": 3, ] if isFoo { ["c": 5] } }
callAsFunction と組み合わせれば↓みたいなこともできる?
let dict = [ "a": 2, "b": 3, ] { if isFoo { ["c": 5] } }
任意箇所への挿入がわかりづらいのは callAsFunction 版の難点か。
Avatar
omochimetaru 04-Aug-20 02:58 AM
げ、マジ
Avatar
koher 04-Aug-20 02:59 AM
multiple trailing closure をさらに組み合わせたら任意箇所への挿入っぽく書けるかな?ww
Avatar
omochimetaru 04-Aug-20 02:59 AM
その技、応用が効きそうだけど、見た目やばいですね・・・
Avatar
koher 04-Aug-20 02:59 AM
型推論で死にそう・・・
Avatar
omochimetaru 04-Aug-20 02:59 AM
自己のfunction builderによるmutatorを受け取るcallAsFunctionをもたせる
テクニックとして一般化できそう
function builderの型推論はかなり良くなってるらしいけど
Avatar
koher 04-Aug-20 03:00 AM
Function Builder あんま好きじゃないんだよなぁ・・・
Avatar
omochimetaru 04-Aug-20 03:00 AM
SwiftUIをやってないからわからん。
Avatar
koher 04-Aug-20 03:00 AM
知らないだけかもしれないけど、途中に無関係な式を挿入する方法あるのかな? (edited)
Avatar
omochimetaru 04-Aug-20 03:01 AM
無関係な式?
Avatar
koher 04-Aug-20 03:01 AM
式でなくて文でもいいんだけど、
計算結果を変数にとっておいて利用するとか。
VStack { let foo = ... Text(foo) Text(foo) }
みたいな
Avatar
omochimetaru 04-Aug-20 03:02 AM
letは対応したんじゃなかったでしたっけ?
Avatar
koher 04-Aug-20 03:02 AM
5.3 でサポートされるんだっけ?
Function Builder ちゃんと追ってないのでわかんない。
Avatar
omochimetaru 04-Aug-20 03:02 AM
わからない
Avatar
koher 04-Aug-20 03:02 AM
if let はサポートされたはず。 (edited)
Avatar
omochimetaru 04-Aug-20 03:02 AM
one-way constraintのPRで
そういうletができるようになるぜって書いてたけど
仕組み的な基盤が入るってだけの話で
その構文が入りましたよって話題では無かったから
まだだめかも。
Avatar
koher 04-Aug-20 03:03 AM
これまで↓だったのが
if foo != nil { Text(foo!) }
↓はできるようになるはず。
if let foo = foo { Text(foo) }
Avatar
omochimetaru 04-Aug-20 03:04 AM
それは出来てほしいですよね〜
Avatar
koher 04-Aug-20 03:05 AM
うん、辛い
Avatar
omochimetaru 04-Aug-20 03:05 AM
てかまあ、 => オペレータを自作すれば今も一応・・・
Avatar
koher 04-Aug-20 03:05 AM
!= nil 書く度に //FIXME 付けてる😂
Avatar
omochimetaru 04-Aug-20 03:05 AM
func =><T, R>(_ f: (T) -> R) -> R
VStack { ... => { (foo) in Text(foo) Text(foo) } }
あ、だめか、 => の ViewBuilder版が必要だw
Avatar
tarunon 04-Aug-20 03:06 AM
.mapでよさそう
Avatar
koher 04-Aug-20 03:07 AM
map だと ViewBuilder にならなくないですか?
Avatar
omochimetaru 04-Aug-20 03:07 AM
.some(foo).map { }
これもViewBuilderにならない問題があるね。
Avatar
tarunon 04-Aug-20 03:09 AM
Optional:View where Wrapped: Viewじゃなかったでしたっけ (edited)
Avatar
omochimetaru 04-Aug-20 03:11 AM
extension Optional where Element: View { func map<T, U: View>(_ f: @ViewBuilder (T) -> U) }
↑これが生えてないと駄目だけど
いや、これもおかしいなw
Avatar
koher 04-Aug-20 03:12 AM
↓になる?
extension Optional where Element: View { @ViewBuilder func map<T, U: View>(_ f: @ViewBuilder (T) -> U) }
Avatar
tarunon 04-Aug-20 03:12 AM
ああなるほど。mapの中でGroupとか使えば解決しそうな気はした
Avatar
omochimetaru 04-Aug-20 03:12 AM
funcの左側に @ViewBuilder 付ける文法あるんですか?
Groupとか使えば
その手はありだね。
Avatar
koher 04-Aug-20 03:13 AM
ちゃんとした構文は知らないけど↓はよくやるよ。
@ViewBuilder var body: some View { ... }
Avatar
omochimetaru 04-Aug-20 03:14 AM
そんなのあったのか。トップレベルがViewBuilderになる?
Avatar
koher 04-Aug-20 03:14 AM
トップはわからないけど、メンバはできる。
Avatar
tarunon 04-Aug-20 03:14 AM
compute getterがbuilderになりますね
Avatar
omochimetaru 04-Aug-20 03:14 AM
あー、トップと言うか、その場合の body の中身が。
Avatar
koher 04-Aug-20 03:15 AM
メソッドにも付けてる例を発見したからメソッドでもできるはず。
Avatar
omochimetaru 04-Aug-20 03:15 AM
なるほど。定義側で自発的にViewBuilderにできるのか、便利。
さっきの例だと Optional.map 自体の実装を ViewBuilder で書けるって事だけど (edited)
ユーザーには関係無さそう
Avatar
koher 04-Aug-20 03:17 AM
rethrows 的な re@ViewBuilder がほしくなるねw
判定不能か。
Avatar
tarunon 04-Aug-20 03:17 AM
1つtoplevel関数作れば解決できる
Avatar
koher 04-Aug-20 03:18 AM
まあ、 if let が使えれば解決なわけで、 5.3 で問題ないはず?
Avatar
koher 04-Aug-20 03:26 AM
今の ViewBuilder って 10 個以上要素並べられないの? https://developer.apple.com/documentation/swiftui/viewbuilder
Avatar
omochimetaru 04-Aug-20 03:27 AM
去年の時はそうだったし今もそうじゃないかしら
TupleViewのオーバーロード数までしかいかない
Avatar
koher 04-Aug-20 03:27 AM
これだと Dictionary literal に使うのは厳しそうだなぁ。
巨大リテラルを書かない前提ならいいのかな・・・。
Avatar
omochimetaru 04-Aug-20 03:28 AM
あーたしかに、SwiftUI.Viewと違って入れ子にしてごまかす方法が無いですね
Avatar
koher 04-Aug-20 03:29 AM
まあ同じ技で入れ子を作らせることはできるだろうけど・・・。
タプルじゃなくて↓方式ならまあいけるか。
let dict: [String: Int] = .init { [ "a": 2, "b": 3, ] if isFoo { ["c": 5] } }
Avatar
omochimetaru 04-Aug-20 03:30 AM
それも刻みの数が10個までになっちゃうのでは。
Avatar
koher 04-Aug-20 03:30 AM
そうだけど、そんなにたくさん条件挿入しないんじゃない?
Avatar
omochimetaru 04-Aug-20 03:31 AM
まあそうですね 足りるであろう数まで定義すれば良い
Avatar
koher 04-Aug-20 03:35 AM
buildBlock って可変長引数対応してるのかな?
それであれば Dictionary は可変長でいけそう。 (edited)
Avatar
omochimetaru 04-Aug-20 03:36 AM
そうですね。試さないとわからない。
Avatar
koher 04-Aug-20 03:43 AM
😂
Failed to produce diagnostic for expression; please file a bug report
@_functionBuilder public struct DictionaryBuilder<Key: Hashable, Value> { public func buildBlock() -> [Key: Value] { [:] } public func buildBlock(_ c0: [Key: Value]) -> [Key: Value] { c0 } public func buildBlock(_ c0: [Key: Value], _ c1: [Key: Value]) -> [Key: Value] { c0.merging(c1) { _, new in new } } } extension Dictionary { public init(@DictionaryBuilder<Key, Value> _ builder: () -> [Key: Value]) { self = builder() } }
import XCTest @testable import DictionaryBuilder final class DictionaryBuilderTests: XCTestCase { func testExample() { let dictionary: [String: Int] = .init { [ "a": 2, "b": 3, ] [ "c": 5, "d": 7, "e": 11, ] } XCTAssertEqual(dictionary, [ "a": 2, "b": 3, "c": 5, "d": 7, "e": 11, ]) } }
モジュール本体はビルドできるけどテストでコンパイラが "Failed to produce diagnostic" に・・・。
init はあやしいかと思って static func にしてみたけど変わらず。
Avatar
rintaro 04-Aug-20 03:47 AM
buildBlock() 群を static func にする必要がありますね。 (edited)
Avatar
koher 04-Aug-20 04:20 AM
おお、見落としてました。ありがとうございます。
それとは別に diagnostic の問題はあるかと。 Function Builder が非公式だからまだいいのかな?
Avatar
omochimetaru 04-Aug-20 04:21 AM
diagnosticは結構筋肉実装だから
見落としてる可能性もあるから報告するといいかも
「staticにし忘れてbuildBlock を定義する」時だけの謎挙動を踏んでる気がする (edited)
Avatar
koher 04-Aug-20 04:23 AM
↓可変長できた。これなら使い物になりそう。
@_functionBuilder public struct DictionaryBuilder<Key: Hashable, Value> { public static func buildBlock(_ contents: [Key: Value]...) -> [Key: Value] { contents.reduce(into: [:]) { $0.merge($1) { _, new in new } } } }
Avatar
rintaro 04-Aug-20 04:23 AM
"Failed to produce diagnostic for expression;" はすべからくコンパイラのバグなので、報告してください🙏
Avatar
omochimetaru 04-Aug-20 04:25 AM
あ、「semaが失敗したけど何もdiagnose出てない」的なelseのメッセージなんですかね (edited)
Avatar
rintaro 04-Aug-20 04:27 AM
そんな感じです。
Avatar
omochimetaru 04-Aug-20 04:29 AM
なるほど
Avatar
koher 04-Aug-20 04:30 AM
おおお、動いた!
let dictionary: [String: Int] = .init { [ "a": 2, "b": 3, ] if isFoo { ["c": 5] } }
コンパイラのバグなので、報告してください🙏
了解です!
Avatar
omochimetaru 04-Aug-20 04:32 AM
SwiftUIも途中にAnyViewが挟まっても動くんだから
可変長のやつがあればいいのに。
Avatar
koher 04-Aug-20 04:33 AM
Proposal Draft には buildIf が Alternative Considered になってる一方、 buildDo とかも載ってて、何が今使えるものなのかわからない・・・。
Avatar
tarunon 04-Aug-20 04:37 AM
SwiftUIで可変長やろうとしたら可変長Genericsが必要になるぞ
Avatar
omochimetaru 04-Aug-20 04:38 AM
@tarunon AnyViewで返すならパラメータ要らないじゃん
Avatar
tarunon 04-Aug-20 04:38 AM
Dictionaryは可変長Genericsが不要なので可能
Avatar
omochimetaru 04-Aug-20 04:38 AM
あー引数が受け取れない?
Avatar
tarunon 04-Aug-20 04:38 AM
そうなりますね
Avatar
omochimetaru 04-Aug-20 04:38 AM
そっか
ユーザー側が全部を .eraseToAnyView するって仕様にしないと
引数の配列の型が書けないのか
Avatar
tarunon 04-Aug-20 04:40 AM
FunctionBuilderは取りあえず1個取り回しの効く定義を置いといて、protocolを拡張する形で色んなのにcoformさせると便利
Avatar
Avatar
koher 06-Aug-20 02:36 AM
Swift と JavaScript の async/await を比較した場合、 suspendAsync(...) に相当するのは new Promise(...) で、 beginAsync に相当するのは await なしでのコールかな? https://gist.github.com/lattner/429b9070918248274f25b714dcfc7619
Concrete proposal for async semantics in Swift. GitHub Gist: instantly share code, notes, and snippets.
beginAsync だと中に複数の非同期関数のコールを書けるからちょっと違う? beginAsync 相当は↓みたいな感じ?
(async () => { await foo(); await bar(); })(); // ここでは await なしでコール
(edited)
Avatar
omochimetaru 06-Aug-20 02:38 AM
そうだと思う
Kotlinだと suspendCoroutine と launch に対応しそう
JavaScriptはそのへんが全くタイプセーフじゃないのでつらそうだ。
Avatar
koher 06-Aug-20 02:57 AM
suspend fun はコールサイトでのマーク( try とか await 的な)は特に必要ないのか。 Java の throws 相当に近いな(コールサイトのマークが必要ないけど suspend / throws が静的にチェックされるという意味で)。
Kotlin 、 suspend を静的にチェックするなら throws もチェックしてくれればよかったのに・・・。そこが一番辛いんだよなぁ。
これか。確かに suspendAsyncnew Promise に対応してそう。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.coroutines.experimental/suspend-coroutine.html
Avatar
omochimetaru 06-Aug-20 03:04 AM
確かにkotlinは await のマークが無いな。
コルーチンコンテキストであるかどうかの静的検査はされてるけど。 (edited)
JavaScriptだと静的検査がないからマーキングは絶対に必要だけど
Kotlinは検査があるからマーキングが無い文法を構成できるんだな
Swiftは静的検査があるけどマーキングもする方針で
どれも違うのが面白いな (edited)
Avatar
koher 06-Aug-20 03:09 AM
await あるほうが可読性高そうだけど・・・。ぱっと見でどこで await になってるかわからないのって結構怖そう・・・。
Avatar
omochimetaru 06-Aug-20 03:14 AM
Android開発でちょっと触ってますけど、
結局外側から見ると、開始するかキャンセルするかで制御するから
フローのどこがawaitなのかってあんまり関係ない気がする
Rx書いてても、map map map って書くのと map flatMap map って書くので
特に何か意識が変わったりしないのと同じで。
単に次のオペレータの型に合わせてflatMapって書いてるだけというか。
Avatar
koher 06-Aug-20 03:18 AM
同期であることを前提として処理を書くことって結構あると思うけど、(シングルスレッドであればここからここまでの間で状態が変化しないとか)非同期が挟まった瞬間にそういう前提が崩れることって結構あると思うんだけど、新しいコードベースに触れるときにどこまでが同期でどこからが非同期なのかが見えなかったらコード読みづらくないかな?書いているときはそこを把握した上でだから書けるだろうけど。
Avatar
omochimetaru 06-Aug-20 03:28 AM
非同期が挟まっちゃった時点で
async func foo() { (await?) f1() (await?) f2() (await?) f3() }
このどこが非同期だったかどうかに影響を受けるシチュエーションが無いような気がする。
現在の状態をビューに書き出す render() があったとして、 await の直後には必ず render() を入れたいとかがあるかなあ? でもそれは状態の変化の方で呼び出しておけばいいしなあ。
Avatar
koher 06-Aug-20 03:38 AM
func foo() async { guard let first = self.values.first else { return } ... bar() if self.values.count == 1 { ... } else { ... } }
みたいなのがあったときに、 barasync だと values が空でないことが保証できないとか。
Avatar
omochimetaru 06-Aug-20 03:42 AM
あ〜、なるほど。 そういうのは確かに怖いので、 fooが values を引数を取るようにして self を都度見ないようにするか、 そもそもfoo() の実行中に self に関して他の競合しうるような非同期タスクが実行されないように、 画面レベルで 非同期タスクの多重実行防止機構をもたせてます。
というのも、 barasync だったとして、 ほかの非同期タスクの影響でも values が変更されうるようなシナリオって、 そもそも認知負荷が高すぎて考慮しきれないから、避けちゃう。
いや、逆なのか 「async じゃなかったときは心配しないでそういうコードを書くことができる」
というメリットが生まれている?
「Optional型の静的検査があって嬉しいのは non-optional 型が扱えるようになること」 みたいな話か
Avatar
koher 06-Aug-20 04:24 AM
なるほど、非同期が async に集約されれば async でないことが同期であることの保証になるのか。
Avatar
omochimetaru 06-Aug-20 04:25 AM
はい。いや、それを koher が主張しているのかと思ったw
Avatar
koher 06-Aug-20 04:27 AM
言いたかったのは、 async でも await が可視なら、 await から await までの間は同様の保証が働くということでした。
Avatar
omochimetaru 06-Aug-20 04:29 AM
そうですね。そこに同期前提のロジックを書ける。
Avatar
koher 06-Aug-20 04:30 AM
という意味で await が不可視なのは怖いかなぁと。
try がなくてジャンプが不可視なのもだけど、 await はより怖い感覚があるなぁ。
Avatar
omochimetaru 06-Aug-20 04:30 AM
確かに書いた時にここは同期だからこれは安全なんだ〜って思って書けるけど
後で読んだ時に ここが非同期だったらバグるけど大丈夫なのか?って
心配になってしまいそうな気がしてきた。
たしかにそうですね、例外が飛んできてもまあエラーハンドラが発火するだけで
変な状態になることは多分すくないけど
思わぬ非同期割り込みは再現性の低いバグの原因になるからもっと悪質な事が起こりそう。
Avatar
koher 07-Aug-20 03:00 AM
The Swift Programming Language に Opaque Type の章できてるの見つけた。 Existential Type のことを Protocol Type と呼んでるんだけど、それに倣った方がいいのかな? https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html
でも、もし any 導入されたら some Animalany Animal のどっちも "Protocol Type" に見えそうだし(もしくはどっちも見えなさそうだし)、やっぱり Existential Type の方がいいか。 (edited)
Avatar
koher 08-Aug-20 12:35 AM
複数エラーを throw したくて禁断の技を使ってしまった・・・。
extension Array: Error where Element: Error {}
😆 1
本当はこれをラップしたエラー型を作るべきなんだろうけど。
Avatar
Kishikawa Katsumi 08-Aug-20 03:09 AM
おもしろい。こういうのもアリかなあ。
Avatar
niw 08-Aug-20 03:40 AM
禁断...!
Avatar
omochimetaru 08-Aug-20 06:48 AM
Setの方が意味的に望ましい? 同じものの重複と順番があってもいいか。
Avatar
koher 08-Aug-20 11:17 PM
@omochimetaru 意味的には Set かもだけど、 Hashable にしないといけないので。
Avatar
masakihori 09-Aug-20 12:16 AM
僕はOptionSetでやった
任意のエラーは無理だけど
Avatar
koher 17-Aug-20 01:51 AM
↓ができてほしくて
let aToZ: ClosedRange<Unicode.Scalar> = "A" ... "Z" for c in aToZ { print(c) }
↓みたいな extension 書いた。これって標準で付いてたらダメ?
extension Unicode.Scalar: Strideable { public func distance(to other: Unicode.Scalar) -> Int { Int(other.value) - Int(self.value) } public func advanced(by n: Int) -> Unicode.Scalar { Unicode.Scalar(UInt32(Int(self.value) + n))! } }
Avatar
omochimetaru 17-Aug-20 03:49 AM
文字列リテラルって Unicode.Scalar にもなるのか。
Avatar
koher 17-Aug-20 04:06 AM
ExpressibleByStringLiteral じゃなくて ExpressibleByUnicodeScalarLiteral が付いてるみたい。 https://developer.apple.com/documentation/swift/unicode/scalar
Avatar
omochimetaru 17-Aug-20 04:07 AM
おお。じゃあリテラルがunicode scalarで見て1単位であることが検証されてそう。
あれ、てかありそうですよ
あ、 Strideable がついてないって話か
Avatar
koher 17-Aug-20 04:10 AM
うん、 Strideable が欲しい。
Avatar
omochimetaru 17-Aug-20 04:10 AM
どうなんですかねえ
割当のない歯抜けのコードポイントとかもあるから
ちょっと変な感じもする
A から Z とかで使うならたしかにしっくりくるけど。
Avatar
niw 17-Aug-20 04:11 AM
あいうえおはソート用に意図的な配列になってるけど
他の言語の文字や記号がそうなってるわけじゃないし
実用性は?かも
使途によるかなあ。
Avatar
omochimetaru 17-Aug-20 04:11 AM
うーんでもレンジの構成はできるんだからいいのかなあ
Avatar
koher 17-Aug-20 04:12 AM
割当のない歯抜けのコードポイント
これって Unicode.Scalar.initnil になるのかな?
Avatar
niw 17-Aug-20 04:12 AM
ならないとおもう
Scalarとしては正しい。
Avatar
omochimetaru 17-Aug-20 04:12 AM
Scalarである以上1ずつ増やすのが自然な気もしてきた。
Avatar
koher 17-Aug-20 04:13 AM
Scalar として考えるなら Strideable であってもおかしくない気が。
Avatar
niw 17-Aug-20 04:13 AM
実用性の問題?
あるいは意図的にscalarでやると分かってない人がへんなコードかくだろうからって
わざと実装してないとか?
Avatar
omochimetaru 17-Aug-20 04:14 AM
文字列から取り出した1つのscalarを、ある範囲にあるか調べるシナリオはよくあるけど
ある範囲のscalarを連続して生成するってシナリオはあんまりない気もしますね
Avatar
koher 17-Aug-20 04:16 AM
("a" ... "z").randomElement()! とかやりたいことは結構あると思うんだけどなぁ。
Avatar
omochimetaru 17-Aug-20 04:17 AM
なるほど
Avatar
niw 17-Aug-20 04:18 AM
asciiではそうかもだけど
一般的なUnicode Scalarでそうかといわれるとうーん
微妙
あって困らないものをAPIにいれるかどうかはなんか思想とては興味深い
Avatar
omochimetaru 17-Aug-20 04:26 AM
PythonとRubyはドカドカ入れてるイメージ
Avatar
niw 17-Aug-20 04:26 AM
そうそう
Avatar
omochimetaru 17-Aug-20 04:26 AM
C++やSwiftはケチケチしてる
Avatar
niw 17-Aug-20 04:27 AM
JavsScriptはnpmで増やしてる
Avatar
koher 17-Aug-20 04:27 AM
標準に入れるものに慎重になるのは理解できる。際限なくなるし。あれが入ってるならこっちが入ってないのはなぜ?と。
OrderedCharacter とかあればいいのかな・・・。
Avatar
tarunon 19-Aug-20 06:12 PM
assoctypeを縛ればexistentialを作れるようにしようぜ!という提案のドラフトだ。 https://github.com/apple/swift-evolution/pull/1170
This proposal is about adding support for values of existential type when its associated types are known to be fixed to fully concrete types. protocol P { associatedtype X } protocol Q: P where X =...
Avatar
koher 20-Aug-20 01:33 AM
あ、そういうことか。 generalized existential ですべての assoctype を縛らないといけないのかと思ったら。
これが今までできなかったのって実装上の問題なんでしたっけ?何か意味があるんですっけ?
Avatar
tarunon 27-Aug-20 12:37 PM
Create own FunctionBuilder from Protocol. Contribute to tarunon/Buildable development by creating an account on GitHub.
emptyとmergeのオペレーターを生やすだけで、任意の構造でFunctionBuilderが使えるようになります
Avatar
koher 27-Aug-20 01:22 PM
なるほど。これは汎用的ですね!
Avatar
tarunon 27-Aug-20 01:24 PM
型プログラミングがめっちゃ超絶技巧なんで見て欲しいw
Avatar
koher 27-Aug-20 01:46 PM
@tarunon ↓こういう実装はいかがでしょうか? https://github.com/koher/Buildable/commit/c4d046af99d884c6327af5312e36dc9641af55e9
Avatar
tarunon 27-Aug-20 01:50 PM
あーーー
前半は型が減ってすっきりなんですが、FunctionBuilder周りはこれ触っちゃうと
_Builderを使ったオレオレサブタイピングの余地が無くなっちゃうんで
ここは置いときたい感じですね。上手いことやれば
@omochimetaru https://t.co/woMynTWzal とりあえずサンプルやで
このパターンに展開できると考えています
これやろうとすると可変長引数だと出来ない
Avatar
koher 27-Aug-20 01:57 PM
FunctionBuilder 自体は汎用にしておいて、 Buildable に適合した型だけその結果を使って build できるようにしたいってことですか?
つまり、 Buildable 以外にも FunctionBuilder を使えるようにしたいと。
ちがうか。 _Builder があるから任意の型を生成できるのか。 (edited)
Avatar
tarunon 27-Aug-20 02:00 PM
そうです
例えば_Builderを使って、OptionalをArrayとして振る舞わせる、みたいな凶悪なことも出来ます
Avatar
koher 27-Aug-20 02:01 PM
組み立てるときに使う部品と完成物が同じ型でなくとも構わないと。
Avatar
tarunon 27-Aug-20 02:03 PM
流石に単一Buildableでそれをやるとassociatedtypeのコンフリクトで死んじゃうんですが、制約は殆どprotocol extensionに逃がしているので (edited)
手前でprotocol定義して拡張を重ねる、とかもできるはず
Avatar
koher 27-Aug-20 02:05 PM
完全には理解できてないですがなんとなくわかったような気がします。
Avatar
rintaro 28-Aug-20 12:21 AM
https://github.com/tarunon/Buildable/blob/831b09aac1bb05fc47a6b171efbce70c8317ece8/Sources/Buildable/FunctionBuilder.swift#L51-L53 Pair<Pair<Pair<C0, C1>, C2>, C3> じゃなくて Pair<Pair<C0, C1>, Pair<C2, C3>> なのには意図があります?
Avatar
tarunon 28-Aug-20 01:33 AM
これどっちでも良かったんですけど、とりあえず慣らしておくか〜と思ってそうしてます
ただまあこの辺はユーザーサイドで弄ることないんで、Tuple2〜9まで用意しちゃってもいいですね
Avatar
rintaro 28-Aug-20 01:40 AM
結合順序が一定していた方が安心かなと思いました。Tuple用意すれば良いのは確かに。
Avatar
tarunon 31-Aug-20 11:51 AM
悪いこと出来そうだな〜と思ったけど駄目でした
Function builder attribute 'FunctionBuilder' cannot be applied to an autoclosure parameter
FunctionBuilderで評価されるexpressionをFunctionBuilderに再帰的に食わせることが出来れば、割と何でもできそうだ、と思ったけど前提が成り立たなかった
Avatar
koher 01-Sep-20 09:30 AM
@swift-5.2.5
struct Foo { func get() -> Int { 42 } var bar: Int { get() } }
Avatar
swift52 BOT 01-Sep-20 09:30 AM
exit status: 1 with stderr:
<stdin>:4:12: error: expected '{' to start getter definition get() ^
Avatar
koher 01-Sep-20 09:30 AM
↑パースできないおもしろい例見つけた。
🤔 1
Avatar
norio_nomura 01-Sep-20 10:25 AM
@swift-5.2.5
struct Foo { func get2() -> Int { 42 } var bar: Int { get2() } }
なるほど。
Avatar
swift52 BOT 01-Sep-20 10:25 AM
no output
Avatar
tarunon 01-Sep-20 11:11 AM
getは予約語じゃないんすね
Avatar
koher 01-Sep-20 11:12 AM
Resultget メソッド持ってますよ。
👉 1
Avatar
omochimetaru 03-Sep-20 02:59 AM
@swift-5.3.3
struct V<K> { func f(_ k: K) {} } struct S { var name: String = "" } V<KeyPath<S, String>>().f(\.name) // OK V<PartialKeyPath<S>>().f(\S.name) // OK V<PartialKeyPath<S>>().f(\.name) // NG
(edited)
Avatar
swift53 BOT 03-Sep-20 02:59 AM
exit status: 1 with stderr:
<stdin>:9:24: error: type of expression is ambiguous without more context V<PartialKeyPath<S>>().f(\.name) // NG ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~
(edited)
Avatar
omochimetaru 03-Sep-20 03:00 AM
これ推論機のバグかなあ。残念すぎる
Avatar
tarunon 03-Sep-20 03:01 AM
V<PartialKeyPath<S>>().f(\S.name)
ならいけるっぽい?
Avatar
omochimetaru 03-Sep-20 03:01 AM
うん。それはいける(すまん入れ違いで追記した
うーんこれが通ったらおしゃれなユーティリティになったのに・・
Avatar
tarunon 03-Sep-20 03:05 AM
KeyPathは使えないんですかね
Avatar
omochimetaru 03-Sep-20 03:05 AM
使えない
Avatar
tarunon 03-Sep-20 03:05 AM
Partialが必須なのかな
Avatar
omochimetaru 03-Sep-20 03:05 AM
VはValidatorなんだよね
結果をフィールド種類ごとに勝手に収集するvalidation helperを作っていて
任意のHashableをキーに使えるようにしたんだ
もともとStringだったけどそれだとtypoするから
で、ユーザ側で勝手に Key = PartialKeyPath<Props> ってやったら
キーパスに限らない使い方もできて便利だった。
KeyPath<Props, String> だと、 Stringじゃないプロパティが収納できないから駄目。
Avatar
tarunon 03-Sep-20 03:06 AM
ん〜〜
KeyPath<Props, T>
Avatar
omochimetaru 03-Sep-20 03:07 AM
シンボルならなんでもいいんだけどKeyPathを使うと便利だった
Avatar
tarunon 03-Sep-20 03:07 AM
これでGenericsパラメータを埋めるなにか後一手があればうまくいきそうだけど
Avatar
omochimetaru 03-Sep-20 03:07 AM
Validatorを自由なKeyじゃなくてKeyPathに縛った仕様にしちゃえば多分回避できる
mutating func notEmpty(for key: Key, value: String) -> Bool { if !value.isEmpty { return true } addFailure(for: key, .empty) return false }
これに <T> たせば PartialじゃなくてKeyPathにできるね。
で、内部のdictionaryにしまうときにPartialKeyPathにアップキャストすればいいから。
Avatar
tarunon 03-Sep-20 03:08 AM
そんなかんじ
Avatar
omochimetaru 03-Sep-20 03:08 AM
KeyPath以外で使いたくなるときが来ることが実際は多分ないから
バグレポだけしていったんそうするか・・・
struct Validator<T> { typealias Key = PartialKeyPath<T> mutating func notEmpty<X>(for key: KeyPath<T, X> , _ value: String) -> Bool { ... } var validator = Validator<Props>() _ = validator.notEmpty(for: \.name, props.name)
これだと動いたよ。無駄な <X> ださい・・・
KeyPath<T, X> から PartialKeyPath<T> への変換は暗黙変換だから
まあ、実装は対して汚れないが・・・
Avatar
tarunon 03-Sep-20 03:12 AM
お〜
Keyが任意の型であっても
extension Validator where Key == PartialKeyPath<T> { // ここに生やす }
でいけそうやな
Avatar
omochimetaru 03-Sep-20 03:14 AM
そこに <T> 書けなくない?
Avatar
tarunon 03-Sep-20 03:14 AM
Validator<T, Key>
Avatar
omochimetaru 03-Sep-20 03:14 AM
それ T にしばる意味がない
validation対象のパラメータセットが1つのstructに集約されている必要が生まれちゃうんだよね
まあ、実際そう作ってることが多いとは思うが。
bugs落ちてるんだがw
🥺 1
もともとの実装は Validator<Key: Hashable> だったのだ。
Avatar
tarunon 03-Sep-20 03:16 AM
てか、Tいらないんだったら
PartialKeyPathである必要もないのでは、AnyKeyPathとか (edited)
Avatar
omochimetaru 03-Sep-20 03:16 AM
それだと
そもそも \.name って書けなくなる。 (edited)
Avatar
tarunon 03-Sep-20 03:16 AM
や、それが書きたいのは関数引数のときだけでしょ
だからStorageはAnyKeyPathにしても問題ないのでは〜と
Avatar
omochimetaru 03-Sep-20 03:17 AM
ああ、Storageはまあそうだけど
Validator自体が <T> もってるからどうせTのkeypathでしか使えなくなってる
if validator.failures[\.password]?.isEmpty, validator.failures[\.passwordConfirm]?.isEmpty { }
辞書参照のほうが通らねえ・・・w
こっちは直接 PartialKeyPath が見えてるから・・・ 辞書直接さらさずにこれも <X> つけたアクセサ作ればごまかせるけどw
Avatar
tarunon 03-Sep-20 03:19 AM
Validator自体にsubscript生やせば解決しそう
extension Validator { subscript<X>(failure: KeyPath<T, X>) -> }
ざっくりこんな感じか
Avatar
omochimetaru 03-Sep-20 03:20 AM
そうだねえ・・・
Avatar
tarunon 03-Sep-20 03:20 AM
確か4.xぐらいでsubscriptにGenerics使えるようになったので
これは動くはず
Avatar
omochimetaru 03-Sep-20 03:20 AM
validator[\.name] が収集されたエラーであることが自明でないからAPIとして微妙だな〜
Avatar
tarunon 03-Sep-20 03:20 AM
やや
validator[failure: \.name] やで
ラベル付きsubscript
Avatar
omochimetaru 03-Sep-20 03:21 AM
あ、その場合は定義側では2回書くよ
Avatar
tarunon 03-Sep-20 03:21 AM
あれ、せやったか
Avatar
omochimetaru 03-Sep-20 03:21 AM
subscriptはfuncのときとルールが逆なのだ
subscriptのラベルでアクセスストレージを示すの微妙じゃない?
dictionaryの["a", default: []] みたいに
オプションパラメータに使うのは良いと思うんだけど。 (edited)
まあ func failure<X>(key: KeyPath<X, T>) -> [Failure] かなあ
Avatar
tarunon 03-Sep-20 03:23 AM
setterいらないならそれでいいやね
Avatar
omochimetaru 03-Sep-20 03:24 AM
if validator.failures(for: \.password).isEmpty, validator.failures(for: \.passwordConfirm).isEmpty { }
まあnil潰せるメリットがおまけで付いてくるのでこれで。。
いまは private(set) だからちょうどいいよ
これ setter あけるとき、 setFailures も実装するけど、
コピーコストが気になって modifyFailures も実装することがよくある
subscriptだと効率的なmodifyが自動で提供されるのが嬉しいよね。
Avatar
tarunon 03-Sep-20 03:25 AM
subscript作っちゃったほうが精神衛生的に良さそう
Avatar
omochimetaru 03-Sep-20 03:26 AM
tarunonはそういうときどうしてんの
俺はよく不愉快になりながらget/set/modify3つ書いてる
Avatar
tarunon 03-Sep-20 03:26 AM
初手subscriptかな
Avatar
omochimetaru 03-Sep-20 03:26 AM
マジか 外で見たことある?
ストレージをラベル指定するタイプのsubscript
Avatar
tarunon 03-Sep-20 03:27 AM
subscriptの難点はIDEの保管に出てこないところなんやが
Avatar
omochimetaru 03-Sep-20 03:27 AM
実装効率と性能は取れるけどAPIがSwiftyでなくなるよね
Avatar
tarunon 03-Sep-20 03:27 AM
えーっと
Avatar
omochimetaru 03-Sep-20 03:27 AM
あ〜、補完たしかに。
Avatar
tarunon 03-Sep-20 03:27 AM
RxSwiftのButton周りがなんかそんなんなかったっけ。。。ちょっと記憶があやふや
Avatar
omochimetaru 03-Sep-20 03:27 AM
ほお
Avatar
tarunon 03-Sep-20 03:28 AM
気のせいな気がしてきた
Avatar
koher 03-Sep-20 03:28 AM
subscript(dynamicMember:) とかは?
Avatar
tarunon 03-Sep-20 03:29 AM
そもそもsubscriptをSwiftyじゃない、と定義してしまうのは、心が狭いというかそんな感じはしていて
便利に使えるものは便利に使うといいんじゃないかな
Avatar
omochimetaru 03-Sep-20 03:29 AM
ん、今 dynamicMember にしたいことは特にない
Avatar
koher 03-Sep-20 03:29 AM
いや↓
ストレージをラベル指定するタイプのsubscript
Avatar
omochimetaru 03-Sep-20 03:30 AM
あー
Validator<Props> にたいして validator.name で nameのエラーが取れるようになるのかな
Avatar
koher 03-Sep-20 03:31 AM
ちょっとちゃんと話を追えてないけど。
Avatar
omochimetaru 03-Sep-20 03:31 AM
どうなんだそれ、validation関数のほうは書けるかな?
Avatar
tarunon 03-Sep-20 03:31 AM
結論ストレージを露出させる場合、Dictionaryを見せたくない場合は - subscript用意する - getter functionはsubscriptを参照するalias functionにする - setter functionもalias用意するけどwarningでsubscript使えと誘導する こうしますかね
これなら補完を普通functionにぶん投げつついい塩梅のAPIになるとおも
Avatar
omochimetaru 03-Sep-20 03:32 AM
結果の方は一旦中継すれば validator.failures.name とかはできそうですね
検査の方は順番ひっくりかえして validator.name.notEmpty(props.name)
こんなスタイルにはできるかも。
誘導用のsetなるほど
KeyPathに寄せるんだったら値の指定も不要にしちゃうか・・・
var validator = Validator(target: props) if validator.notEmpty(for: \.password) { _ = validator.minLength( for: \.password, length: setting.passwordMinLength ) } _ = validator.notEmpty(for: \.passwordConfirm) if validator.failures(for: \.password).isEmpty, validator.failures(for: \.passwordConfirm).isEmpty { _ = validator.checkConfirm(for: \.passwordConfirm, original: \.password) }
おしゃれではある
Avatar
omochimetaru 04-Sep-20 04:56 AM
swift-nioのEventLoopFuture使いにくいンゴね
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - apple/swift-nio
mapの中でthrowできなくて、mapの中でthrowするやつはflatMapThrowsで、 flatMapの中でthrowできない
throwsをResultモナドだと思ってResultモナドがFutureモナドのサブタイプだとみなしているのできれいではあるけど
フローの組み換えで面倒な場面が多い
CombineのflatMapもthrowはできないのか。 mapの中でthrowするやつはtryMapだった。
Avatar
koher 04-Sep-20 05:11 AM
async/await 入ったら標準ライブラリに Future も入るのかな? Proposal で触れられてるけど。そしたら、標準ライブラリと Combine と SwiftNIO で Future が乱立・・・。
Avatar
omochimetaru 04-Sep-20 05:12 AM
SEは別になるか一緒になるかはわからんけど Future は追加されそう Resultがあるし。
Avatar
koher 04-Sep-20 05:12 AM
throw に対する Resultasync に対する Future とすると、標準ライブラリでは FutureFailure を持たないという設計も考えられる。
Avatar
omochimetaru 04-Sep-20 05:12 AM
てか、Futureがないと、2つ開始して両方を待つとかできないですから。 (edited)
あ〜。
文法上のasyncはthrowsと直行するからか。
うーん、厳密にasyncだけをモナド化しなくて、throwsコミコミのFutureが使いやすい気がするけどな
nothrowなasyncはFuture.Failure==Neverで扱えるし。
Avatar
koher 04-Sep-20 05:14 AM
もし Future<Value, Failure: Error> にしてしまうと、今後第三のモナドに対する throws/try, async/await 相当の構文が導入されたときにモメそう。 (edited)
async throws な関数をラップすることを考えると FutureFailure がないと厳しいよなぁ・・・。
let a = Future { try await foo() } let b = Future { try await bar() } let c = try await a.get() + b.get()
Avatar
tarunon 04-Sep-20 05:22 AM
第三のモナド、差し当たりyield/generatorとかですかね?
Avatar
omochimetaru 04-Sep-20 05:22 AM
そのget()、Future.FailureがNeverのときやっぱりnothrowになってほしいな
Avatar
koher 04-Sep-20 05:23 AM
かもしれないし、もっと何かあるかもしれません。何せ今見えてないものなので。 < 第三
Avatar
omochimetaru 04-Sep-20 05:23 AM
generatorは func next() async で扱えそう
Avatar
koher 04-Sep-20 05:23 AM
async/await で generator 作る例を Joe Groff が昔書いてたはず。
Avatar
omochimetaru 04-Sep-20 05:24 AM
one-shot な Algebraic Effectsなら 例外構文とPromiseがあればエミュレートできるから
Avatar
tarunon 04-Sep-20 05:24 AM
FutureにError入れなくても、一応はモナドにラップできるんで入れないほうがいいんじゃないかな〜
Avatar
omochimetaru 04-Sep-20 05:24 AM
async/throwsの2つでかなりの線形計算?をカバーしてるはずで
そこから漏れてるのはone-shotじゃない場合だから
callcc的な繰り返し再開できる継続って事になるんかな
Avatar
tarunon 04-Sep-20 05:25 AM
let a = Future { await Result { try foo() } } let b = Future { await Result { try bar() } } let c = try await a.get().get() + b.get().get()
throws-rethrowsと同じように、async-reasyncがあれば、↑のように書けるはず。
Avatar
koher 04-Sep-20 05:26 AM
let a = Future { await Result { try await foo() } } let b = Future { await Result { try await bar() } } let c = try await a.get().get() + b.get().get()
って まったく同じこと書いてたw
(edited)
あ、 foobarawait がいるはず。
Avatar
tarunon 04-Sep-20 05:26 AM
one-shot な Algebraic Effectsなら 例外構文とPromiseがあればエミュレートできる
asyncがある世界でgenerator欲しくなるのは、one-shotじゃない場合がほとんどなんじゃないかしら(one-shotの意図を履き違えてたらすまん
Avatar
koher 04-Sep-20 05:27 AM
reasync されて Future の方でさらに await が必要。
Avatar
tarunon 04-Sep-20 05:27 AM
ああ、
確かに
Avatar
omochimetaru 04-Sep-20 05:27 AM
generatorは
たんにasyncなSequenceじゃない?
Avatar
koher 04-Sep-20 05:28 AM
Future<Result<T, E>> に対して、 func get() async throws E -> Textension がほしい。
そうすれば get().get()get() でよくなる。 (edited)
Avatar
tarunon 04-Sep-20 05:28 AM
async generatorとgeneratorは分けて考える気がする(TS脳
Avatar
omochimetaru 04-Sep-20 05:29 AM
あーまあそういう整理もできるけど
asyncでないgeneratorは結局coroutineでsuspend/resumeしているので
ユーザにasync/awaitが扱える言語ならasyncの上で一般のgeneratorが組めるよ
Avatar
koher 04-Sep-20 05:30 AM
そのためにはまず Parameterized extensions が必要で、道は遠い・・・。
Avatar
omochimetaru 04-Sep-20 05:30 AM
Swiftの予定だと Coroutineをまず作って、その上でawaitとgenerator作れるねって話になっとるね
Avatar
tarunon 04-Sep-20 05:30 AM
overloadの解決順も、結構柔軟に定義できるようにしないといけない気がするな
Avatar
omochimetaru 04-Sep-20 05:31 AM
Kotlinと同じ方針
Avatar
tarunon 04-Sep-20 05:31 AM
その方針自体は良さそうだと思っていて
まあ追々Generatorも出てくるのか。
try, async, yieldに対して、それぞれ単一のモナドがstdlib上に定義されている状態が
まあシンプルだと思うんだけどな〜FutureはErrorつけられちゃうんだろうか。
Avatar
omochimetaru 04-Sep-20 05:32 AM
yieldのモナドは既にあるSequenceじゃないか?
実装側がシーケンシャルな処理でreturnの代わりにyieldで停止/再開するだけで
それをオブジェクト化したものは
Avatar
tarunon 04-Sep-20 05:32 AM
どのSequenceを当てるんだろ、LazySequenceでいいのかな
Avatar
omochimetaru 04-Sep-20 05:32 AM
いや、Sequenceは.next() だけだから
ぴったりはまってるはず
next()が呼ばれたら再開して次のyieldの結果を持ってくる。
Avatar
tarunon 04-Sep-20 05:33 AM
Sequenceはprotocolでしょ、何らかの具体型が用意される予感はしている
Avatar
koher 04-Sep-20 05:33 AM
Swift 6 で async/await 導入されるなら、 Future が同時に導入されないのはきついので、 Parametrized extension はそれまでに入らなさそうな気がするし、 Failure 入れられちゃいそうな気がする・・・。
Avatar
omochimetaru 04-Sep-20 05:33 AM
個別の generator func が、 some Sequence じゃない?
Avatar
koher 04-Sep-20 05:33 AM
妥協で FutureResult 型が導入されればいいのかな。
Avatar
omochimetaru 04-Sep-20 05:34 AM
実装がそのままfuncなんだから、一つずつ違う型になる
Avatar
tarunon 04-Sep-20 05:34 AM
ふむ。
Avatar
omochimetaru 04-Sep-20 05:34 AM
eraseしたいならAnySequenceにしまう。
Avatar
tarunon 04-Sep-20 05:34 AM
Futureが同時に入らない、というのは有り得そうな気がする
確かにAnySequenceで良さそうだ
Avatar
koher 04-Sep-20 05:34 AM
同時に入らないの結構つらそうじゃないですか?並行で実行しづらい。
Avatar
omochimetaru 04-Sep-20 05:35 AM
てか、僕は普通に
Avatar
koher 04-Sep-20 05:35 AM
オレオレ Future が乱立するか、 Combine.Future に対する extension ができるかかな。
Avatar
omochimetaru 04-Sep-20 05:35 AM
例外内包したFutureが良いと思っているので
それで良い
Avatar
tarunon 04-Sep-20 05:35 AM
Combine.Future に対する extension ができる
現実的にはここに落ちると思います
Avatar
omochimetaru 04-Sep-20 05:35 AM
NIO.EventLoopFuture は EventLoop の制御が入ってるんでちょっと別ですね
Combine.Future はどうなんだろう。
Avatar
tarunon 04-Sep-20 05:36 AM
そのままだと何も入ってないと思います
オペレーターで付与していける
Avatar
omochimetaru 04-Sep-20 05:37 AM
Futureが例外もってても、Failure == Never のときにはasyncだけの振る舞いをもってれば、十分じゃないです?
Avatar
koher 04-Sep-20 05:37 AM
import Combine extension Future where Failure == Error { init(execute: () async throws -> Value) { ... } }
(edited)
みたいなのがあれば良い?
Avatar
omochimetaru 04-Sep-20 05:38 AM
それは欲しいですね。 @escaping がいりそう
Avatar
tarunon 04-Sep-20 05:39 AM
あと
extension Future where Failure == Never { init(execute: () async -> Value) { ... } }
現実的にはこれと↑の2つで
完了とされるんじゃないか、と思います。
Avatar
omochimetaru 04-Sep-20 05:39 AM
それで良いと思うなあ。
Avatar
koher 04-Sep-20 05:40 AM
あとは get() async throws -> Output か。
Avatar
tarunon 04-Sep-20 05:40 AM
Resultと違ってmap/flatMapの先が普通にPublisherになっちゃうんで
Avatar
omochimetaru 04-Sep-20 05:40 AM
そうですね。Neverのときにthrowsなしのgetがほしいですね。
Avatar
koher 04-Sep-20 05:40 AM
Never のときは get() async -> Output
Avatar
tarunon 04-Sep-20 05:40 AM
get()をどの範囲まで生やすか、というのが難しそう
Avatar
omochimetaru 04-Sep-20 05:40 AM
Resultに無いけど・・・
Avatar
koher 04-Sep-20 05:40 AM
しかし、それを言うならこのまえの Result のが。
Avatar
omochimetaru 04-Sep-20 05:40 AM
まあResultは遅れてその後のSEで入れるとかなりそう。
Avatar
koher 04-Sep-20 05:41 AM
Resultと違ってmap/flatMapの先が普通にPublisherになっちゃうんで
これつらそう・・・。
Avatar
tarunon 04-Sep-20 05:41 AM
ぶっちゃけNeverとthrowsに関してはそこまで問題ではない、map/flatMapのが
Avatar
omochimetaru 04-Sep-20 05:41 AM
それはCombine.Futureの話?
Avatar
tarunon 04-Sep-20 05:41 AM
そう
Avatar
omochimetaru 04-Sep-20 05:41 AM
mapしたら要素数Nになるのw
Combine.Futureはインチキだったのか
RxSwift.SingleはmapしてもSingleなのに・・・
Avatar
koher 04-Sep-20 05:42 AM
single であることを表す protocol を導入して、 conditional comformance 使って解決する?
Avatar
omochimetaru 04-Sep-20 05:43 AM
RxSwiftはzeroとzero or oneとoneが型になってるけどなかなか便利。
Maybe型の zero or one は async awaitにキャンセルが追加されたような世界観で使える。
Avatar
tarunon 04-Sep-20 05:43 AM
singleというか、async compatibleなprotocolを用意して
Avatar
koher 04-Sep-20 05:43 AM
protocol Single: Publisher { ... } extension Future: Single { ... } extension Publishers.Map: Single where Upstream: Single { ... }
みたいな。
Avatar
tarunon 04-Sep-20 05:44 AM
Futureがそれに適合、Map,FlatMapはUpstreamがそれに適合してれば…みたいに
かなり広範囲で拡張が必要でしんどそうだな、と。
Avatar
omochimetaru 04-Sep-20 05:45 AM
RxSwiftみたいにSingleは別で用意して、 asPublisher() で 通常のN個のストリームに切り替えでも良いのでは
Avatar
koher 04-Sep-20 05:45 AM
async で取り出せる get がないと辛いし、やっぱ専用の標準 Future ほしそう。
Future なしで async/await 入って、オレオレ Future 乱立がありそうだな・・・。
Avatar
omochimetaru 04-Sep-20 05:45 AM
まあそうやってがんばったextensionだと、暗黙変換(というか型が同じ)にできるのは便利だけども。
antitypical/Result を思い出すw
Avatar
tarunon 04-Sep-20 05:48 AM
まー最初はオレオレFutureでバトロワさせて
優勝したやつを採用!とかすれば、効率いいんじゃないですかね
Resultと同じパターン
Avatar
koher 04-Sep-20 05:48 AM
FutureFailure を持たなくても、
extension<T> Future where Value == Result<T> { init(execute: @escaping () async throws -> T) { ... } }
があれば良い?
Avatar
tarunon 04-Sep-20 05:49 AM
それはそうだと思いますよ
Future が Failure を持たなくても、
(edited)
Avatar
omochimetaru 04-Sep-20 05:49 AM
mapがめんどくさくないですか?
Avatar
koher 04-Sep-20 05:49 AM
map も同様
Avatar
omochimetaru 04-Sep-20 05:49 AM
同様だと、値としてResultを持ちたいFutureと
値はTだけどエラーとともにあつかいたいFutureが混ざる
Avatar
tarunon 04-Sep-20 05:49 AM
mapに関しては、overloadの優先順位付けがもうちょいちゃんと書けるように慣れば
解決する
Avatar
koher 04-Sep-20 05:49 AM
ってか、よく考えたらそんなこと PromiseK でやってたわ。その頃は Result じゃなくて Optional だったけど。
Avatar
omochimetaru 04-Sep-20 05:50 AM
PromiseK でやってたわ
それ念頭にあって話してるのかと・・・
a: Future<String, Error>b: Future<Result<String>, Never (edited)
a.flatMap { Future.failure(err) }.map { print("出ない") } b.map { Result.failure(err) }.map { print("出る") } このへんが違うから。 (edited)
Avatar
tarunon 04-Sep-20 05:52 AM
うーん
ネストしたモナドにおいて全部mapで表現しようとしてるからしんどくなるのであって
Avatar
koher 04-Sep-20 05:52 AM
mapMap とかにすれば良い?
Avatar
tarunon 04-Sep-20 05:53 AM
どのモナドまでmapするのかみたいなのが明示出来るようになる方が良さそうな気がしている
Avatar
omochimetaru 04-Sep-20 05:53 AM
てか、こう言えば良いのか
do { let a = try await foo() } catch { ... } do { let b: Result<String, Error> = await bar() } catch { ... }
↑この2つの違いに相当する
(edited)
Avatar
tarunon 04-Sep-20 05:53 AM
例えばFeature<Result<T, E>>なら、
Avatar
koher 04-Sep-20 05:53 AM
でも、 Future<Result<T, E>>Future<T ,E> の気分で使いたいと考えたら、基本的にそういう挙動をするようにすればいいんじゃないのかなぁ。
Avatar
omochimetaru 04-Sep-20 05:53 AM
async/awaitを使いつつ throw/tryはしないでResultを取り回したい時があって
エラーを値として使いたくて、失敗フローにはしたくないとき
Avatar
tarunon 04-Sep-20 05:54 AM
foo.map { a: Result<T, E> in ... } foo.result.map { a: T in ... }
こういう感じの書き方ができると
Avatar
omochimetaru 04-Sep-20 05:54 AM
それをFutureで再現するには、Future自体にエラーコンセプトが要る。
Avatar
tarunon 04-Sep-20 05:54 AM
何重ネストしても任意のところで取り出せるようになるよね
Avatar
koher 04-Sep-20 05:55 AM
↓は?
let b: Result<String, Error> = await Result { try await bar() }
Avatar
tarunon 04-Sep-20 05:56 AM
或いは第一引数に識別子入れるとクロージャの引数が合わせた型になるとか。
foo.map(who: .future) { a: Result<T, E> in ... } foo.map(who: .result) { a: T in ... }
こういう感じにしておくと、第三第四のモナドが出てきても安定して拡張していける、と思う。
先に出した案のほうがネストして重ねまくっても対応出来るので良いかな〜という気はしているけど
引数パターンのほうが使いやすそうではある。
Avatar
koher 04-Sep-20 05:58 AM
asyncthrows をちゃんと区別してくれたら、 FutureFuture<T, E> でいい気もします・・・。
Avatar
omochimetaru 04-Sep-20 05:58 AM
let b: Result<String, Error> = await Result { try await bar() }
↑これどうなってるんです?なぜResult.initの中でawaitできる?
Avatar
koher 04-Sep-20 05:58 AM
FutureResult は主役ではなくて、 async/awaitthrows/try では解決できないコーナーケースをハンドリングするためのヘルパーなので。
@omochimetaru reasync がついてる。
Avatar
omochimetaru 04-Sep-20 05:59 AM
initをasyncにできるようにするってこと?
うーん、まあ別にできてもいいか。
init?もinit throwsもあるし。
Avatar
koher 04-Sep-20 05:59 AM
init(catching body: () throws -> Success)
↑の Result.init が↓に変わる。
init(catching body: () async throws -> Success) reasync
Avatar
tarunon 04-Sep-20 06:00 AM
出来なくてもinitじゃなくてstatic funcになるだけかと。
Avatar
omochimetaru 04-Sep-20 06:00 AM
それはできるね > static func
Avatar
koher 04-Sep-20 06:00 AM
これ見てて思ったんだけど、明示的なPromiseやFutureを表に見せる方式のasync/awaitを採用してる場合、コンストラスタをasyncにすることができない? https://t.co/SxI1pvzemi
コンストラクター内でasync/await使いたい時がちょくちょくあるけど、普通にasync無名関数即時実行で書けるのか( ´・‿・`) 見にくいような、ありなような、迷う🤔
Swift の initasync 書けると思ってるんだけどどうなんだろう?
Avatar
omochimetaru 04-Sep-20 06:01 AM
これどういうことですか?
コンストラクタの呼び出しは、async関数投げっぱなしのまま戻ってきちゃうよね?
Avatar
koher 04-Sep-20 06:01 AM
JS みたいに Promise を基本として async/await を考えた場合、
コンストラクタは Promise を返せないから async にできないけど、
Swift みたいに PromiseFuture に基づかずに async/await を導入する場合、
コンストラクタ/イニシャライザが async になれる。
Avatar
omochimetaru 04-Sep-20 06:03 AM
まあそうですね
なんか、表面的な話に思いますけど。
Avatar
koher 04-Sep-20 06:03 AM
この mono さんの書いてるのは async 付いてるのとは挙動は違うけど(待たずに返るので)。 (edited)
Avatar
omochimetaru 04-Sep-20 06:04 AM
別にJSでもctorがasync付けられるように拡張してやることはできそう シンプルに仕様を積み上げていったら都合上できなくなっただけの話に思う。
ですよね、待たずに返りますよね
普通になしでは・・・
Avatar
koher 04-Sep-20 06:04 AM
いや、 mono さんがやりたかったのは単に待たずに返すので (edited)
Avatar
omochimetaru 04-Sep-20 06:05 AM
@_mono オブジェクト生成に直接係わらないasync関数を呼びたい場合に有効、ってことですか?
@Cat_sushi そんな感じです。
会話があった
単純に外側がasyncじゃないからawaitが書けないということを言いたかっただけで
Avatar
koher 04-Sep-20 06:05 AM
それを見ながら別の話としてイニシャライザに async を付ける話を考えたということ。
Avatar
omochimetaru 04-Sep-20 06:05 AM
非同期なオブジェクト初期化をしたいという話ではなかったのか。
Avatar
koher 04-Sep-20 06:06 AM
async コンストラクタができる言語ってあるのかな?
Avatar
omochimetaru 04-Sep-20 06:06 AM
知る範囲では無いです
Avatar
koher 04-Sep-20 06:06 AM
C# とか Python とかどうなんだろう。
Rust も確かできないんだっけ?
Avatar
omochimetaru 04-Sep-20 06:06 AM
C#ではstatic funcでCreate関数つくろうねって
ガイドラインがある
Avatar
koher 07-Sep-20 08:56 AM
API の意味合いが異なるのはわかるけど、 init(bigEndian:).bigEndian って挙動同じじゃない? https://developer.apple.com/documentation/swift/uint64/1539824-init https://developer.apple.com/documentation/swift/uint64/1538836-bigendian
Avatar
omochimetaru 07-Sep-20 08:58 AM
挙動というのがデータ変換のことなら同じ処理ですね。
意味は逆さまだと思います。
Avatar
koher 07-Sep-20 09:00 AM
意味は逆さまだけど、 @swift-5.2.5
let a: UInt64 = 1 print(a.bigEndian) print(UInt64(bigEndian: a))
Avatar
swift52 BOT 07-Sep-20 09:00 AM
72057594037927936 72057594037927936
Avatar
koher 07-Sep-20 09:00 AM
結果はまったく同じになるよね。
コードの意図で使い分けるだけで。
Avatar
omochimetaru 07-Sep-20 09:01 AM
はい。 LE to BE と BE to LE は同じ処理です。
ただ、だからといって、このAPIを .endianSwapped などにはしないほうが良いです
なぜなら、ホスト環境を隠蔽できなくなるから。
このAPI ( init LE from BE と convert LE to BE ) にしておけば、 もしホスト環境が BE になってても、同じコードで動きます。 ( init BE from BE と convert BE to BE になる )
Avatar
koher 07-Sep-20 09:03 AM
それは .bigEndian.littleEndian の話じゃない? (edited)
Avatar
omochimetaru 07-Sep-20 09:05 AM
let a: UInt64 = 1 print(a.bigEndian) // aをLEだと思ってそのBE表現を得ているコード print(UInt64(bigEndian: a)) // aをBEだと思ってそのLE表現を得ているコード // ↑この2つが並んでるのは `a` の解釈が矛盾してるのでおかしい
LE環境だったら.littleEndian は何もしない関数になるけど
もしBE環境だったら、 .bigEndian が何もしない関数で、 .littleEngian がスワップする関数に切り替わりますね。
Avatar
koher 07-Sep-20 09:06 AM
.endianSwapped.bigEndian と同じじゃなくて、常にひっくり返すって意味やんね?
それじゃだめで、 .bigEndian.littleEndian の二つは必要。
でも、 init(bigEndian:)init(littleEndian:) はそれぞれ .bigEndian, .littleEndian と同じ挙動だから、コードの意図の表明以上の意味はないよね?という疑問。
Avatar
omochimetaru 07-Sep-20 09:08 AM
そうです x3 (edited)
Avatar
koher 07-Sep-20 09:09 AM
つまり、実装は
extension UInt64 { var bigEndian: UInt64 { UInt64(bigEndian: self) } }
でも構わないわけだ。
Avatar
omochimetaru 07-Sep-20 09:09 AM
そうですね。
Avatar
koher 07-Sep-20 09:09 AM
実際はそれぞれ実装されてたけど。
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 07-Sep-20 09:09 AM
流石に意味的な可読性が最悪なので・・・
@inlinable public var bigEndian: Self { #if _endian(big) return self #else return byteSwapped #endif }
Avatar
koher 07-Sep-20 09:10 AM
了解です。認識が合っててよかったです。ありがとう。 (edited)
Avatar
omochimetaru 07-Sep-20 09:10 AM
_endian
↑こんなんあるんや
裏技だ
まあなんか例えば、 bitpatternに対してXORする暗号化方式があるときに
encrypt関数とdecrypt関数が全く同じ実装になるのと 同じような話ですね
Avatar
freddi 10-Sep-20 07:40 AM
2回前のわいわいで話した、SILInstruction::myTrap のケースが不十分説(https://speakerdeck.com/freddi/mayhavesideeffect?slide=40) いつか調べると言ってましたが、PR出したら本当にケースが不十分だったっぽい https://github.com/apple/swift/pull/33851 (edited)
👏 6
Avatar
freddi 14-Sep-20 01:03 AM
https://github.com/apple/swift/pull/33932 #unavailable を追加するやつ (edited)
Implementation for an upcoming evolution proposal. apple/swift-evolution#1184 Swift evolution thread: https://forums.swift.org/t/support-negative-availability-literals/
Avatar
niw 14-Sep-20 05:29 AM
#available(*, unavailable) があるのに。
Avatar
freddi 14-Sep-20 06:04 AM
あーいわれてみればたしかに
Avatar
koher 16-Sep-20 02:35 AM
let expectation = XCTestExpectation() var cancellables: [AnyCancellable] = [] observableObject.objectWillChange.sink { _ in expectation.fulfill() }.store(in: &cancellables) wait(for: [expectation], timeout: 3.0)
みたいなコード書いてたけど、最適化を有効にしたら(おそらく)スコープの途中で cancellables が片付けられてしまって observableObject が発火しなくなってしまった。
Avatar
Kishikawa Katsumi 16-Sep-20 02:47 AM
それ、最適化のせいだとするとコンパイラの不具合ですよね。
Avatar
koher 16-Sep-20 02:52 AM
うーん、使われないものは前倒しして解放されても良いというルールなら不具合とは言えないかもしれません。 (edited)
↑のケースでは、仕方なくスコープの最後に(必要なテストを行った後で) cancel を呼び出すことで解放されなくなりました。
Avatar
Kishikawa Katsumi 16-Sep-20 02:56 AM
ちなみにstoreを無くして戻り値として受けるとどうなりますか?
cancelを呼ばないと消える?
Avatar
koher 16-Sep-20 02:57 AM
お、消えませんね。
cancel を呼びやすいように元々 store をなくして戻り値で受けてたんですが、 cancel を消しても(未使用警告は出ますが)購読解除はされませんでした。
store に戻した上で
cancellables.forEach { $0.cancel() }
を最後に実行しても購読解除されなかったので、最適化で早期リリースされてるのは間違ってないんじゃないかと思います。
戻り値で受けたときに早期リリースされないのは単なる最適化の実装の問題で、 store で最適化されるなら戻り値で受けた場合も最適化され得るものとして、末尾 cancel するのが良さそうに思います。
Avatar
Kishikawa Katsumi 16-Sep-20 03:01 AM
ローカル変数が最適化でスコープの途中で消えるのは正しい、、、のかなあ、と気になっています。
Avatar
koher 16-Sep-20 03:01 AM
store のときの挙動が最適化のバグの可能性もあると思います。
それが確定して修正されればいいんですが、現時点でははっきりしないので、仕様の可能性もある前提で対処することになりそうです・・・。
Avatar
tarunon 16-Sep-20 03:54 AM
これはwithExtendedLifetimeを使うのが正しそう
「使われないものはどこで解放しても良い」の命題は真なので
Avatar
Kishikawa Katsumi 16-Sep-20 03:56 AM
そういえばそんなのありましたね > withExtendedLifetime
Avatar
tarunon 16-Sep-20 03:56 AM
そのための関数ですね。Discordに登場するのはこれで3回目だ
Avatar
Kishikawa Katsumi 16-Sep-20 03:56 AM
とはいえ、 >「使われないものはどこで解放しても良い」の命題は真なので これの判定はそれほど自明じゃないと思いますよ
Avatar
tarunon 16-Sep-20 03:56 AM
うーーーん
むしろwithExtendedLifetimeという関数が存在することが、命題が真であることの裏付けであると言える気がしていて
Avatar
Kishikawa Katsumi 16-Sep-20 03:57 AM
いや、でもレキシカルに使われてないように見えたら消してもいい、のルールの方が自明とも言えるか。
Avatar
tarunon 16-Sep-20 03:57 AM
スコープの途中で消えない仕様ならそんな関数要らないので。
Avatar
Kishikawa Katsumi 16-Sep-20 03:58 AM
それでいい気がしてきました。
Avatar
tarunon 16-Sep-20 03:58 AM
最適化したら消えるようになる、と言うのは、省メモリを最適化の目的に置くなら(当然置かれるわけですが)割と合理的な気はしますし (edited)
Avatar
Kishikawa Katsumi 16-Sep-20 04:00 AM
まあコンパイラなりStatic Analyzerなりが教えてくれないと事故が起こりそうなやつですね。
Avatar
tarunon 16-Sep-20 04:00 AM
宣言した変数が一切参照されてない場合は、warningは出ると思います (edited)
Avatar
Kishikawa Katsumi 16-Sep-20 04:05 AM
さっきの例で戻り値で使ってない場合はそうなんですけど、
var cancellables: [AnyCancellable] = [] observableObject.objectWillChange.sink { _ in expectation.fulfill() }.store(in: &cancellables)
このinoutに渡した例だと何もでない、ですよね?
Avatar
tarunon 16-Sep-20 04:05 AM
確かにー
Avatar
Kishikawa Katsumi 16-Sep-20 04:05 AM
で、消えるのはこっちなんですよね。。。
Avatar
tarunon 16-Sep-20 04:05 AM
まあなんか非同期テストのIFがもうちょいなんとかなってくれや、と言う話な気はしますね
exp作ってwait([exp])やって、と言うのがモダンではないしスコープも人間が管理するにしては難しい
nimbleとか使いたくなる気持ちがとてもわかる
Avatar
Kishikawa Katsumi 16-Sep-20 04:06 AM
確かによく考えたらこれ非同期を待ってるから、そもそも一回スコープを出ているのか。。。?
Avatar
tarunon 16-Sep-20 04:06 AM
出てはないですね。waitで止まるので
Avatar
Kishikawa Katsumi 16-Sep-20 04:07 AM
いや、出てないよね。
Avatar
tarunon 16-Sep-20 04:07 AM
swiftというかObjCの場合は、runloopがあるのでスレッドを含めた話だともうちょいややこしくなるけど
Avatar
Kishikawa Katsumi 16-Sep-20 04:07 AM
async/awaitが必要なんだな。Test Frameworkの方に先に入れる、とか良さそうじゃないかしら。
Avatar
tarunon 16-Sep-20 04:08 AM
swiftならもっとまともなIFは用意できるはずなので公式に出して欲しいなぁ
async/awaitだと遥かにマシになるのはそうなんですが
observableObjectはasyncの枠に収まってないので
結局同じ問題は起きそう
Avatar
Kishikawa Katsumi 16-Sep-20 04:10 AM
あ、おっしゃる通りですね。。。この例については解決しない。
wait(for: [expectation は要するにPromiseだからAsync/Await的な書き方にできそうだな。
Avatar
tarunon 16-Sep-20 04:13 AM
tsのjestとか見てると出来てますね
Avatar
Kishikawa Katsumi 16-Sep-20 04:14 AM
へえ。勉強しよう。
Avatar
tarunon 16-Sep-20 04:16 AM
2パターンあって、中に宣言する関数が全てasyncなら、test関数そのものをasyncにしてしまえばOKで、 コールバックを含めた処理がある場合は、test関数の第一引数にテスト完了を通達するクロージャが渡ってきて、それを呼ぶ事でテストが完了する
こういう作りにしておくと上手くいきます。いまのXCTestCaseは引数無しなんで、実現出来ない。
Avatar
Kishikawa Katsumi 16-Sep-20 04:18 AM
test関数そのものをasyncにしてしまえばOK
わかる。
test関数の第一引数にテスト完了を通達するクロージャが渡
かしこい。 つまりtest関数が最初から非同期処理を考慮した作りになってるんですね。
Avatar
tarunon 16-Sep-20 04:21 AM
そうです。tsはベースが動的型付言語で、引数の数が合わなくてもなんとかなる(=省略して書いてもok)なので、上記の条件が満たされたいれば、同期的なテストもそのままでOKになってる感がありますね。 内部的に高効率にオーバーロードしてるのかは調べてないですが。 (edited)
Avatar
Kishikawa Katsumi 16-Sep-20 04:30 AM
TypeScriptはそのJavaScriptの性質のためにオーバーロードはあまり得意じゃないんじゃなかったかしら。 Testing Frameworkみたいなプロダクションに載らないのは分けてメンテする、みたいにならないかな。 別の依存関係がただ同梱されている、みたいな。
Avatar
kateinoigakukun 16-Sep-20 04:30 AM
コールバックを含めた処理がある場合は、test関数の第一引数にテスト完了を通達するクロージャが渡ってきて、それを呼ぶ事でテストが完了する
これってタイムアウトどうなってるんですか?
completionを呼ばなければずっと完了しない?
Avatar
tarunon 16-Sep-20 04:31 AM
jestって、testメソッドの宣言ではなく、スコープ内でtest関数をコールしてその中に処理を書くスタイルなんですよね
なのでtest関数にタイムアウトを渡すことができる
nimbleと一緒です
Avatar
kateinoigakukun 16-Sep-20 04:32 AM
あーなるほど、そのコンテキスト自体にタイムアウトの設定が渡せるのか。
Avatar
tarunon 16-Sep-20 04:33 AM
ですです
IDEとXCTestが密結合してるせいでnimble使っても微妙な感じになりやすいのがなー。そういえば
XCTest周りはXcode12で色々変わってませんでしたっけ
カスタムできるようになってると嬉しいですね
Avatar
Kishikawa Katsumi 16-Sep-20 04:36 AM
あまりちゃんとみてないけどStoreKitとか今までテストしようがなかったものがテストできるようになった、とかは良い変更ですね。
Avatar
kateinoigakukun 16-Sep-20 04:37 AM
いつかその辺りのインテグレーションもカスタムできるようになるのかなぁ…?
あれ、でもこのcompletionクロージャのパターンでも一旦スコープ抜けるから購読は解除されるんじゃないですか?
RxJSのObservableをテストするときはどういうことになってるんだろう
Avatar
tarunon 16-Sep-20 04:38 AM
jsはガベコレだから無意識に循環参照作って解決したりしてそう
Avatar
kateinoigakukun 16-Sep-20 04:39 AM
ああそうかarcじゃないか
Avatar
tarunon 16-Sep-20 04:39 AM
swiftだとリテイン用のコンテナ渡さないといけなさそうですね
理想的にはテスト用のコンテキストを渡すようになってるといいのか
Avatar
kateinoigakukun 16-Sep-20 04:40 AM
[AnyCancellable]を inoutで渡せば良いのかな
Avatar
tarunon 16-Sep-20 04:40 AM
完了の通達とか完了までリテインカウント増やしてくれるための参照とか
そういうのが必要なはず、でも今時点では整ってないから、使う側で事故ってる (edited)
AnyCancellableは今回のコンテキストではその通りですが、一般的に任意の参照を取りたくなるはずなので (edited)
Anyで良さそう
Avatar
kateinoigakukun 16-Sep-20 04:45 AM
func XCTAsync<Context>(_ context: Context, timeout: TimeInterval = 3.0, _ body: (inout Context, () -> Void) -> Void) { var context = context let expectation = XCTestExpectation() withExtendedLifetime(context) { body(&context, expectation.fulfill) wait(for: [expectation], timeout: timeout) } }
(edited)
こんな感じかな
Avatar
tarunon 16-Sep-20 04:46 AM
💮っぽい
contextが後から決まる事の方が多そうなのでOptionalの方が良いのかなとか考えたけど
そうすると型推論がはちゃめちゃになるから微妙か
Avatar
kateinoigakukun 16-Sep-20 04:49 AM
しばらくこれ使ってみよう
Avatar
tarunon 16-Sep-20 04:51 AM
withExtendedLifetime、どっちかというとクロージャー内で宣言された全ての変数のライフタイムを管理してほしいとか思ったんだが無理筋だなー
FunctionBuilderで何とかなったりしないかなとか思ったけど1行ずつスコープ抜けるから無理か…
Avatar
kateinoigakukun 16-Sep-20 04:54 AM
autoreleasepoolのリリースしないバージョンみたいな
Avatar
tarunon 16-Sep-20 04:57 AM
そうそう
Avatar
Kishikawa Katsumi 16-Sep-20 05:04 AM
文字通りAutoReleasePoolをリリースしなければいけそう、だけどSwiftだと専用クロージャになってしまったからダメだな。 (edited)
Avatar
norio_nomura 17-Sep-20 01:14 AM
swift OSS Toolchain macOS版のシンボルインストーラのダウンロードが2048MBで止まってしまう問題、半年近く経っても直らない… https://bugs.swift.org/browse/SR-12405
Avatar
niw 17-Sep-20 01:56 AM
CDNの問題?
Avatar
norio_nomura 17-Sep-20 02:10 AM
CDN使ってるのかな?swift.orgから直接ダウンロードしている様に見える。
Avatar
niw 17-Sep-20 05:51 AM
> GET /builds/swift-5.2.1-release/xcode/swift-5.2.1-RELEASE/swift-5.2.1-RELEASE-osx-symbols.pkg HTTP/1.1 > Host: swift.org > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 OK < Connection: close < Proxy-Connection: close < Via: HTTP/1.1 localhost.localdomain (IBM-PROXY-WTE) < Date: Thu, 17 Sep 2020 05:51:35 GMT < Server: Apache < X-Frame-Options: SAMEORIGIN < Strict-Transport-Security: max-age=15768000;includeSubDomains < Last-Modified: Mon, 30 Mar 2020 11:10:20 GMT < Accept-Ranges: bytes < Content-Length: 3305608957 < Content-Type: application/vnd.apple.installer+xml
IBM-PROXY-WTE とは
swift.org は 169.47.73.10 に解決されて、
# whois.ripe.net inetnum: 169.47.73.0 - 169.47.73.31 netname: NETBLK-SOFTLAYER-RIPE-CUST-MS43377-RIPE descr: IBM - Open Technology and Cloud Performance
なんですよね
IBM?
Avatar
rintaro 22-Sep-20 04:47 PM
https://swift.org/blog/swift-on-windows/ Win32 API のラッパーUIライブラリとかも作ってたんですねー
Avatar
Kishikawa Katsumi 22-Sep-20 09:09 PM
サンプルがGUIアプリやぞ⁉️っと思って見に行ったらWin32 APIをSwiftから呼べるようにラップしとった。 すごい作業だなあ。
Avatar
rinsuki 22-Sep-20 10:29 PM
私もちょっと前に Swift on Windows 試してみたんですが、Swift から Win32 API を呼び出すのなかなか新鮮な体験で面白かったです https://github.com/rinsuki-lab/win32-hello-world-in-swift/blob/master/hello-world.swift
Win32 Hello world in Swift! Contribute to rinsuki-lab/win32-hello-world-in-swift development by creating an account on GitHub.
😄 1
Avatar
niw 23-Sep-20 07:02 AM
Win32...
Avatar
omochimetaru 23-Sep-20 07:03 AM
Win32は不死身
Avatar
niw 23-Sep-20 07:03 AM
compnerdの尽力すごい... すごいけど...
すごいけど... なんかsingle point of failureな気持ち
Avatar
omochimetaru 23-Sep-20 07:03 AM
ドットネット系は接続しづらいからなあ。
Avatar
niw 23-Sep-20 07:03 AM
win32辛すぎる
Microsoftが本腰いれてとかならあれだけど。
Avatar
omochimetaru 23-Sep-20 07:05 AM
業務で使うんだと、C#/XAMLでGUIだけ作って、Swiftで作ったコアにつなぐみたいな感じのほうが現実的そう
Avatar
niw 23-Sep-20 07:06 AM
Corelib FoundationのコードみてからmacOS以外で実用するのが怖くなった感ある
Avatar
omochimetaru 23-Sep-20 07:07 AM
正式リリースされたし大丈夫・・・
Avatar
niw 23-Sep-20 07:07 AM
Foundationのソースみたら多分macOSも使えなくなるかも
Avatar
omochimetaru 23-Sep-20 07:07 AM
ww
Avatar
niw 23-Sep-20 07:08 AM
(diassembleした限りやばいのがちらほら...)
(UIKitも動いてるからま、いいのかな...)
Avatar
kateinoigakukun 23-Sep-20 07:08 AM
compnerdさんがSwift on Winモチベ無くなった時にどうなるんだろう 🤔
Avatar
niw 23-Sep-20 07:08 AM
それ怖い
Avatar
omochimetaru 23-Sep-20 07:08 AM
一応Google Brainに転職したぐらいだし
モチベは過去最高なのでは
Avatar
niw 23-Sep-20 07:08 AM
CI なくなるとか
Avatar
omochimetaru 23-Sep-20 07:08 AM
これまでは趣味だったわけだし。
Avatar
kateinoigakukun 23-Sep-20 07:08 AM
そうそうCIとかインフラが個人に依存してるのがちょっと怖い
Avatar
omochimetaru 23-Sep-20 07:09 AM
Google Brainは S4TF を広めるために Windows サポートは必須でしょって方向だと思う。
エネルギーおばけのcompnerdさんがやる気なくすよりも、 Googleが Swift for TensorFlow 諦める可能性のほうが高そうで怖い。
Avatar
kateinoigakukun 23-Sep-20 07:10 AM
うーんたしかに
Avatar
omochimetaru 23-Sep-20 07:10 AM
Googleは結構巨大プロジェクトしばらくやってやっぱ無理ポイーすることある
Windowsサポートが出たわけだし、次のTFサミットでどうなるかだと思う・・・
Avatar
tarunon 23-Sep-20 07:48 AM
どっかパブリックな場でgoogle canonical languageにSwift追加しました、とか出てきたらオッてなりそう
Avatar
omochimetaru 23-Sep-20 07:52 AM
FlutterをSwiftにしてほしい。
Avatar
tarunon 23-Sep-20 07:53 AM
わかる(iOSDCの雑談でもその話した)
kotlin/swiftどっちかなら間違いなく覇権でしたね〜って
Avatar
omochimetaru 23-Sep-20 07:54 AM
わかる
Avatar
kateinoigakukun 23-Sep-20 07:54 AM
わかる
Avatar
tarunon 23-Sep-20 07:55 AM
tsでも覇権になってたかも知らん
兎角プレイヤー人口の多い言語ならね
Avatar
omochimetaru 23-Sep-20 07:56 AM
ああ〜。
Avatar
niw 23-Sep-20 08:00 AM
わかる
D... D...
Avatar
omochimetaru 23-Sep-20 08:04 AM
Dartが言語としてどうなのかはしらんけどわざわざ新しく学ぶハードルはありますねえ
Avatar
niw 23-Sep-20 08:05 AM
語弊はあるかもしれないけれど、一度死んだ言語だったという印象がある
それが蘇ったと。
Avatar
omochimetaru 23-Sep-20 08:05 AM
Chromeにネイティブで載せようとしてましたね
そのへんが流れたから死んだ感はあるけど
言語仕様というよりウェブ哲学の関係で駄目だったと思うしDart2.0でいろいろ変わってるからまあそこは関係ないはず
そのせいで印象が悪いというのはありそう。
Avatar
niw 23-Sep-20 08:06 AM
Googleのチーム政治とか関わってそうで怖い。知らんけど。
Avatar
omochimetaru 23-Sep-20 08:08 AM
Flutterエンジン自体が根っこは小さなchromiumみたいな話があって
思想的に継承されたプロジェクトな気がしてる
Avatar
niw 23-Sep-20 08:24 AM
KotlinがGoogleのじゃないことも影響してそう
😞 3
Avatar
omochimetaru 23-Sep-20 08:25 AM
時系列的にAndroid開発にKotlin推奨するよりも前じゃなかったっけ
Avatar
niw 23-Sep-20 08:27 AM
同じような時期だったきが。
言語として登場したのは。
Avatar
omochimetaru 23-Sep-20 08:27 AM
ふむ
Avatar
Kishikawa Katsumi 23-Sep-20 03:17 PM
https://medium.com/flutter/announcing-flutter-windows-alpha-33982cd0f433 FlutterもWindowsサポートに投資してるっぽいし、ここが最後の決め手になるのかもしれませんね。 ただデスクトップはWebとの競争があるけど。。。
Native Windows app compilation, some early plugins, and a desktop-ready Flutter Gallery app
Avatar
Kishikawa Katsumi 26-Sep-20 09:52 AM
Online Playgroundにシェア機能(パーマリンク)つけた https://swift-playground.kishikawakatsumi.com/eg3me6bkn5g55bdetc3eipcnue ^ Swiftのバージョンとコードが一意のURLで保存されてるのでコードを共有できる。
Avatar
yutailang0119 26-Sep-20 09:53 AM
gist読んでくれるの神機能
Avatar
kateinoigakukun 26-Sep-20 09:54 AM
ogp画像まで付いてる 🙄
Avatar
Kishikawa Katsumi 26-Sep-20 09:55 AM
Gistから取れるの https://carbon.now.sh/ から拝借したアイデア。OGPも https://carbon.now.sh/ で作られています。
Carbon is the easiest way to create and share beautiful images of your source code.
あとは適当にID発行してFirestoreにコードとSwiftバージョンを保存しているだけ。
OGPはデータで返すのはダメっぽいのでパーマリンクに .png を付けたら画像が返るようになっていて、それをOGPのURLにしたHTMLを返している。
Avatar
Kishikawa Katsumi 26-Sep-20 12:03 PM
iframeで埋め込みできるようにしたいな。そしてブログ記事には抜粋を載せておいて、完全な実行できるコードはこちら、みたいにしたい。
Avatar
kateinoigakukun 26-Sep-20 12:23 PM
pod try 的なパッケージをサクッと試せる環境がオンラインで作れると嬉しそうですね
Avatar
Kishikawa Katsumi 26-Sep-20 12:31 PM
それやりたい。 Swift Package Registry Serviceが導入されたら簡単になるかなあ。
Avatar
kateinoigakukun 26-Sep-20 12:57 PM
Hello! Last June, Apple and GitHub announced that the GitHub Package Registry will support Swift packages. A few months ago, Bryan Clark started a thread to gather ideas about a standard package registry API that could be implemented by anyone, not only GitHub. Over the past...
そういえばGo PlaygroundもRust Playgroundも基本外部ライブラリを使えないようになってるんですけど、任意のライブラリを入れられるようにするのはやっぱりまずいんですかね。
Avatar
omochimetaru 26-Sep-20 12:58 PM
コピペして突っ込めるから問題なさそうな気がする
Avatar
kateinoigakukun 26-Sep-20 12:59 PM
そんな気もするんですけどねー
Avatar
Kishikawa Katsumi 26-Sep-20 01:05 PM
別に問題ないと思うよ。実行はサンドボックスだし。
私はUIが難しくなって、あまり広くは使われなさそうと思ってたけど、動くドキュメントとして使うぶんにはURLやリクエストパラメータで設定できるからそこをサポートするだけで便利かも。
Avatar
kateinoigakukun 26-Sep-20 01:27 PM
That’s always a possibility, but I’ve yet to come up with or hear a workable solution that doesn’t cost lots of money or expose a service for abuse. Right now, all the crates are precompiled so that when you click the run button, only your entered code needs to be compiled. A...
That’s always a possibility, but I’ve yet to come up with or hear a workable solution that doesn’t cost lots of money or expose a service for abuse.
Avatar
omochimetaru 26-Sep-20 01:28 PM
コスト
Avatar
kateinoigakukun 26-Sep-20 01:28 PM
サービスの乱用
コンテナからホストにアクセスする脆弱性がない限り大丈夫そう
Avatar
Kishikawa Katsumi 26-Sep-20 04:00 PM
もうちょっと大掛かりなやつだけどRepl.itはJSとPythonはライブラリを突っ込める仕組みが用意されてた https://docs.repl.it/repls/packages JSで試したけどサイドバーからパッケージ検索できて検索結果をインストールできるみたいな感じ。VSCodeのエクステンションのインストールのUIに近い。
Avatar
Kishikawa Katsumi 28-Sep-20 10:31 PM
WebのPlaygroundでSourceKit-LSPのAuto Completeが出せるようになった。 だいぶ遅いけどチューニングすればもうちょい速度でそう。 まあこういう速度だと分かって使うぶんには便利なはず。iPadみたいなそもそもまともな補完が不可能なデバイスからちょっと書きたいとか。 (edited)
👀 1
https://swiftfiddle.com/ で試せる。
SwiftFiddle is an online playground for creating, sharing and embedding Swift fiddles (little Swift programs that run directly in your browser).
Avatar
omochimetaru 29-Sep-20 04:31 AM
おー!
サーバー側でサービス立てて、jsのカーソル位置とか自力で通信を中継してるんですか?
Avatar
Kishikawa Katsumi 29-Sep-20 04:34 AM
そうです。SourceKit-LSPとやりとりするのはVaporで作ったAPIサーバで、Node.jsのWebアプリからそれとローカルで通信します。 カーソルの情報とかトリガーはブラウザから送られるので、まあ多少時間かかりますね。
Avatar
omochimetaru 29-Sep-20 04:38 AM
IDEサービス使いこなしてて良いですねえ でもサーバー側のCPUコスト課金が心配になる
Avatar
Kishikawa Katsumi 29-Sep-20 04:41 AM
今のところ同じところにデプロイしているので変わってないんですけど(500/月)、ちょっといろいろ便利にしようという気になってきたので、性能をちょっとあげようかなと思っています。 ドメインも取った。
Avatar
omochimetaru 29-Sep-20 04:46 AM
いいですねえ
Avatar
Kishikawa Katsumi 29-Sep-20 04:46 AM
Vaporはめっちゃ簡単でよくできていた。 ただCtrl+Cで終了しなかったり、プロセスが残ったりする(後者はSwiftのせいかも?)とか、 コード変わってないのに swift run すると30個くらいのファイルがコンパイルされたりするのがよくわからない。
Avatar
omochimetaru 29-Sep-20 04:47 AM
うーんなんだろう?Vaporやってるけどその辺は心当たりなし
Avatar
niw 29-Sep-20 04:49 AM
C-cで終了しないのは、何らかのthreadが残ってるから?
swift runでいっぱいコンパイルされるのはmtimeが変わってしまうなにかが動いてるとか。
Avatar
Kishikawa Katsumi 29-Sep-20 04:50 AM
あ、勝手にSourceKit-LSPのプロセスを実行してるからですか?
Avatar
niw 29-Sep-20 04:50 AM
fork(2)ですか?
Avatar
Kishikawa Katsumi 29-Sep-20 04:51 AM
Foundation.Processですね。forkかどうかはよくわからないです。。
Avatar
omochimetaru 29-Sep-20 04:51 AM
vaporがC-cを自前でハンドルしてるとしたら、そっちのプロセスにはシグナルが飛んでなさそう
Avatar
niw 29-Sep-20 04:51 AM
fork(2)してexecev(2)が普通ですが
pidをwaitしないとゾンビ化すると思う
Avatar
Kishikawa Katsumi 29-Sep-20 04:52 AM
直せそうな気がしてきました🙏🏻
Avatar
niw 29-Sep-20 04:53 AM
システムとしては、プロセスの管理は自前でやるより、macosなら、launchd(1)とかsystemdとかに任せる方が良いと思います
Avatar
omochimetaru 29-Sep-20 04:54 AM
SourceKit-LSPとvaporとnodejsをそれぞれdockerに閉じ込めてdocker-composeで管理するとか。
Avatar
niw 29-Sep-20 04:54 AM
全部おなじコンテナでもいいと思うけれど。
Avatar
Kishikawa Katsumi 29-Sep-20 04:55 AM
デプロイ先はLinuxですね。 SourceKit-LSPのバインディングがProcessクラスのインスタンスをセットする作りになってるんですよね。。
Avatar
niw 29-Sep-20 04:56 AM
へー。
Avatar
Kishikawa Katsumi 29-Sep-20 04:56 AM
あ、Processは不要でした。file descriptorでよかったです。
Avatar
omochimetaru 29-Sep-20 04:57 AM
じゃあソケットにもできそうですね。
Avatar
niw 29-Sep-20 04:57 AM
ですね
時代は疎結合
きみのことは知らないし、面倒みない!
Avatar
omochimetaru 29-Sep-20 04:58 AM
launchdとかsystemdとかよくわからない、docker-compose.ymlのほうが簡単・・・
Avatar
niw 29-Sep-20 04:58 AM
pid1問題だけ気を付けれていれば
Avatar
Kishikawa Katsumi 29-Sep-20 04:58 AM
どうもありがとうございます。 この問題のせいで、Pushして再デプロイするときにポートが開放されないままだったりという症状が起こったりして、 デプロイが自動化できなかったんですよね。
Avatar
niw 29-Sep-20 04:58 AM
それでもいい
launchdしらないとmacosでサバイブできない
☠️ 1
Avatar
Kishikawa Katsumi 29-Sep-20 05:00 AM
LaunchdはCronとしての使い方しかしたことないですね。。
Avatar
niw 29-Sep-20 05:01 AM
priviledge とるのにlaunchdのサービス書かないとダメなんですよねー。macos。
Avatar
omochimetaru 29-Sep-20 05:01 AM
へ〜
Avatar
niw 29-Sep-20 05:02 AM
なんかこのへん
privileged helperをlaunchdで起動してそいつと通信してなんかしてて的なそんな感じ
sandboxでは必須だった気がする
Avatar
Kishikawa Katsumi 29-Sep-20 12:34 PM
Vaporちょっと触ってみて、クライアントからサーバサイドまで全部同じデータ型の利点はなんとなくわかった気がする。
レスポンスで返すにはCodableとは似て非なる型に適合する必要がなぜなのか若干よくわからない。
Avatar
omochimetaru 29-Sep-20 12:58 PM
Content protocol ですね、あれは、 Codable + ContentType です。
HTTPの。 application/json とか。
デフォルトのContent-Typeをその型に与えてるだけで、直接指定もできる。
Avatar
kateinoigakukun 29-Sep-20 12:59 PM
そこ型ごとに決まるのか
Avatar
omochimetaru 29-Sep-20 12:59 PM
指定しなかった場合のデフォルトだからあんまり気にする必要もないけどね
Avatar
kateinoigakukun 29-Sep-20 01:00 PM
Content-Typeはエンコーダと対応して欲しい感覚があるけど、型で指定できた方が嬉しい場面があるのかな
デフォルトで決まるのはあくまでエンコーダで、それに対応するContent-Typeがデフォルトで挿入される、みたいな。
Avatar
omochimetaru 29-Sep-20 01:01 PM
JSONしか使ってないから何も感じてない 要らないしくみな気がする (edited)
Avatar
Kishikawa Katsumi 29-Sep-20 01:01 PM
なるほど。 Asoc Typeがオプショナルなとき?にその型はCodableなんだけどそのままContentにできなかった。
Avatar
omochimetaru 29-Sep-20 01:02 PM
ただデフォルト extensionでJSONが入ってくるから必要になったらつけてる
Avatar
Kishikawa Katsumi 29-Sep-20 01:02 PM
Conditional Conformで解決できるらしいけどわからなかった。
Avatar
kateinoigakukun 29-Sep-20 01:03 PM
JSONしか使わない なるほど
Avatar
omochimetaru 29-Sep-20 01:03 PM
extension Optional: Content where Wrapped == その型 { ... } かな?
デフォルトで決まるのはあくまでエンコーダで
なんかContentEncoderってオブジェクトも介在していた気がする
Avatar
Kishikawa Katsumi 29-Sep-20 01:04 PM
なんかそのあとencodeなんとかの実装を求められた気がします。後でもう一度やってみます。 (edited)
Avatar
omochimetaru 29-Sep-20 01:04 PM
あ、それはそうですね。 encodeinit(from decoder) は手書きになるはず
その型自体がCodableなんで singleValueContainer で出し入れすればいいけど (edited)
Avatar
kateinoigakukun 29-Sep-20 01:05 PM
さすがにそれは自動実装してくれないか
Avatar
omochimetaru 29-Sep-20 01:05 PM
あいや、 Codable はそもそも
conditional conform されてるか?
Optionalってどうだったっけ。
Avatar
Kishikawa Katsumi 29-Sep-20 01:06 PM
その必要だと言われるencodeなんとかはCodableのじゃなかった気がするんですよね。 リクエストオブジェクトがパラメータで渡るやつだった気がする。
Avatar
omochimetaru 29-Sep-20 01:07 PM
💧 A server-side Swift web framework. Contribute to vapor/vapor development by creating an account on GitHub.
extension Dictionary: Content, ResponseEncodable, RequestDecodable where Key == String, Value: Content { public static var defaultContentType: HTTPMediaType { return .json } }
↑defaultContentTypeが必要だったのかも。
Avatar
Kishikawa Katsumi 29-Sep-20 01:07 PM
なるほど。
Avatar
omochimetaru 29-Sep-20 01:08 PM
extension Content { public static var defaultContentType: HTTPMediaType { return .json }
↑これ自動で入らないのかな・・・
Conditional Conform するとき、そのrequirementsがdefaultをもってても自動注入されない? (edited)
Avatar
Kishikawa Katsumi 29-Sep-20 01:08 PM
ビューを返すタイプのサービスはよく分からないけどAPIを作るのは全然Vaporでいけるな。
Avatar
omochimetaru 29-Sep-20 01:09 PM
@swift-5.3.3
protocol P { func p() -> Int } struct S<T> {} extension P { func p() -> Int { 1 } } extension S : P where T == Int {}
Avatar
swift53 BOT 29-Sep-20 01:09 PM
no output
Avatar
omochimetaru 29-Sep-20 01:10 PM
されてるな? う~ん?
ビューを返すタイプのサービス
Vaporが採用してるテンプレートエンジンのLeafってやつがあるんですけど
(edited)
これは全然イケてないので
FunctionBuilderでHTMLレンダラを自作するか、ライブラリを探して来ると良いと思います。
Avatar
Kishikawa Katsumi 29-Sep-20 01:12 PM
FunctionBuilderでHTMLを書くのは絶対にツラいと確信してるけど、やってみたら変わるかもしれないな。。。
Avatar
omochimetaru 29-Sep-20 01:12 PM
既存のHTMLから機械変換できるツールはほしいですね。
今回は僕はサーバはJSON埋め込んだ固定の出力にして、JS側のReactをテンプレートの代わりに使ってます。
Avatar
Kishikawa Katsumi 29-Sep-20 01:14 PM
それはめっちゃいいと思う。 JSX?
Avatar
omochimetaru 29-Sep-20 01:14 PM
ですね。TypeScriptなんでtsx
これがよいのは
webpack-dev-serverで、tsxだけライブでプレビューできるので
XIBの見た目をInterfacebuilderで確認しながら作るようなノリで
Avatar
Kishikawa Katsumi 29-Sep-20 01:14 PM
あ、そういうのもあるんすね。JSXはFacebookの執念を感じるすばらしいものです。
Avatar
omochimetaru 29-Sep-20 01:15 PM
TypeScriptでViewを作って
最後にSwiftからパラメータを渡してアプリにつなぎこむ感じに作業が進められる。
TypeScriptだとJSX中の式展開が型検査されるから変数名のtypoとか防げるのがいいっすね。
Avatar
Kishikawa Katsumi 29-Sep-20 01:17 PM
それはいい体験だな。HTMLに変数をなんかするやつで出合う問題のほとんど解決されそう。
TSXはすごいな。
Avatar
omochimetaru 29-Sep-20 01:18 PM
そうなんですよね。
Avatar
Kishikawa Katsumi 29-Sep-20 01:18 PM
ただちょっとSvelteも気になってるんすよね。
Avatar
omochimetaru 29-Sep-20 01:19 PM
Svelte最近聞きますね、まだ学んでないからよくわからないけど
<script> const persons = [ { name: 'Alice' }, { name: 'Bob'}, { name: 'Carol' } ]; </script> <main> {#each persons as p} <div>{p.name}</div> {/each} </main> <style> </style>
xml風の文法でコードが埋め込みなのか。
TSXだとvisual studio codeが常に構文チェックしてくれるのがいいんだけど、svelteはそういうツーリングはいけてるんだろうか?
Avatar
Kishikawa Katsumi 29-Sep-20 01:22 PM
知り合いの人がめっちゃ気に入ってて2時間くらい教えてくれるYouTubeがあってそれを少しずつみてる。型チェックがあるかはまだわからない。 埋め込んだ変数がリアクティブなのは最初のほうで見た。
Avatar
omochimetaru 29-Sep-20 01:23 PM
ほお~ 落ち着いたら調べてみようかな。
どっちかというとVapor環境の開発環境にReactを直接統合したいんだよな、漠然としたイメージしかないけど・・・
Avatar
Kishikawa Katsumi 29-Sep-20 01:25 PM
そういうことだと全部SwiftでSSRのほうがいいのかも?
Avatar
omochimetaru 29-Sep-20 01:26 PM
そういうことになるよなあ
でもpostしないでブラウザ上でロジック動かしたい場面は多少は出てくるので・・・
Swift for WASMが必要になってくる。
Avatar
kateinoigakukun 29-Sep-20 01:27 PM
Blazorってやつがそういう体験を実現してくれそう?
MSがツーリング周りも気合い入れて頑張ってるっぽい
Avatar
omochimetaru 29-Sep-20 01:29 PM
へえ~  新しいザマリン
Avatar
Kishikawa Katsumi 29-Sep-20 01:52 PM
いつの間にかめっちゃわかりやすくなってた。
Avatar
tarunon 29-Sep-20 02:27 PM
svelteはtypescript導入中だった気がする
まだなので型はない
priorityは高くやってた…気がする…
と思ったら7月に対応してた (edited)
😆 1
Avatar
kateinoigakukun 30-Sep-20 03:52 AM
「ある型から自信の型への変換が可能である」を表現するプロトコルのネーミングをどうしようか悩んでいるんですが、良い例あったりしますか?具体的には「JavaScriptの値からSwiftの型へ変換可能である」を表現するプロトコルについて考えています。 今は JSValueConstructible という名前にしているんですが、JS value to Swift value なのかSwift value to JS valueなのかわかりにくくてリネームしたい。
ExpressibleByXXX っていう案も出たんですが、標準ライブラリ内だとリテラル絡みでしか使われていないのでどうなのかな、と。 (edited)
Avatar
Kishikawa Katsumi 30-Sep-20 03:54 AM
インターフェースはどうなってますか?
Avatar
kateinoigakukun 30-Sep-20 03:55 AM
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
static funcの代わりにinitに変更するほうが良いかなとも思ってます
Avatar
Kishikawa Katsumi 30-Sep-20 03:56 AM
変換先のSwiftの型の方に実装するんすね。
Avatar
kateinoigakukun 30-Sep-20 03:57 AM
そうですね. JSValue -> Selfの変換をSelfの型に実装する形です (edited)
Avatar
Kishikawa Katsumi 30-Sep-20 04:03 AM
〜ConvertibleかBridgeableを最初思いついたけど、既存の使われ方だとそれは変換元に実装する感じっぽいですよね。
とするとJSValueAcceptableみたいな感じになりそうだけど、名前はもっと良いのがありそう
Avatar
kateinoigakukun 30-Sep-20 04:04 AM
CustomStringConvertible とかを考えるとConvertibleは Self -> Valueなのかなーと思って今の使い方になってますね
Avatar
Kishikawa Katsumi 30-Sep-20 04:05 AM
SwiftTypeTransformable
Avatar
kateinoigakukun 30-Sep-20 04:05 AM
BridgableObjectiveCBridgeable を見るとSelf -> Value と Value -> Selfのペアになっていて微妙にマッチしない
なるほど変換先の名前で記述する
Avatar
Kishikawa Katsumi 30-Sep-20 04:06 AM
なんか違うな
extension Bool: SwiftTypeTransformable ってみたときに違和感がある気がする
いや、いけるか?難しいな。
Avatar
kateinoigakukun 30-Sep-20 04:07 AM
うーん、この違和感は何なんだろう
SwiftコードにSwiftっていう名前があるのが気になるのかな
Avatar
Kishikawa Katsumi 30-Sep-20 04:08 AM
extension Bool: JSValueTransformable こっちの方がわかる。とすると元の名前でも良さそうだけど。
extension Bool: JSValueConvertible extension Bool: JSValueBridgeable これは明らかにto JSValueに見える。 SwiftConvertibleはSwift Type側につけるともう意味不明。だから却下でいいかな。
Avatar
kateinoigakukun 30-Sep-20 04:11 AM
あとはInとOutを明確にするためにConstructibleFromJSValueみたいな?
Avatar
Kishikawa Katsumi 30-Sep-20 04:12 AM
それいいんじゃないですかね。
extension Bool: ConstructibleFromJSValue わかりやすい。自然。
Avatar
kateinoigakukun 30-Sep-20 04:15 AM
Constructibleが引っかかる気もするんですが良い語が他にないな…
Avatar
Kishikawa Katsumi 30-Sep-20 04:17 AM
https://github.com/swiftwasm/JavaScriptKit/issues/87 これっすね。 ここに挙げられているものとその他の案を実際に書いてみるとたぶんConstructibleFromJSValueは一番ベターっぽい。
I always forget which is which, maybe something like ConvertibleToJSValue and ConstructibleFromJSValue would be more explicit?
私見です。
Avatar
kateinoigakukun 30-Sep-20 04:18 AM
そうそう、今ところ ConstructibleFromJSValue かなぁ
Avatar
Kishikawa Katsumi 30-Sep-20 04:19 AM
extension Bool: ExpressibleByJSValue なんか使い方が違うっぽく見えるんですよね。リテラルを変換するやつに引きずられて。
Avatar
kateinoigakukun 30-Sep-20 04:20 AM
そうなんですよねー。ExpressibleByの意味的にはマッチするんですけどstdlibでの使われ方を考えるとリテラル感がでちゃうですよね。
stdlibの使われ方を纏めるとこんな感じかな - XXXConvertible: Self -> Target - XXXBrigable: Self -> Target & Target -> Self - ExpressibleByXXX: Literal -> Self
Avatar
Kishikawa Katsumi 30-Sep-20 04:31 AM
Frameworkの実装だけ見ると、このProtocolは利用者は意識することないのかな、と思ったけど、 extension Account: ConstructibleFromJSValue みたいな自分で作ったそこそこの規模のStructに実装するとかもある? (edited)
Avatar
kateinoigakukun 30-Sep-20 04:34 AM
その粒度のstructはCodableでJavaScriptオブジェクトにシリアライズされるので基本的にユーザーが一生懸命このプロトコルを実装しないといけないストーリはないはずですね。
確かにユーザーが直接使う機会は少ないかもしれない
Avatar
Kishikawa Katsumi 30-Sep-20 04:36 AM
そうするとまあいうほど重要な名前ではない、、、のでまあConstructibleFromJSValueでいいんじゃないかな。
Avatar
kateinoigakukun 30-Sep-20 04:37 AM
ユースサイトのリポジトリ横断してgrepしてみたんですが一回も使われてませんでした…w
基本的にフレームワーク内で使われるだけならそこまで過敏に気にする必要もないですね
Avatar
koher 30-Sep-20 04:43 AM
これってイニシャライザじゃだめなんですか?それなら Initializable もありかなと。
Avatar
kateinoigakukun 30-Sep-20 04:45 AM
イニシャライザにするのはありです
extension Bool: InitializableByJSValue {}
あんまりSwiftのインターフェースとして見ない単語だったので躊躇していたんですけど、そこまで違和感ない?
Avatar
koher 30-Sep-20 04:48 AM
Initializer は Swift の用語だし、そっちの方がわかりやすいかも? Self を返す static funcinit と等価だと思いますし、 init の方が Swifty な気もします。
Avatar
Kishikawa Katsumi 30-Sep-20 04:50 AM
私はインターフェースをinitにしてもConstructibleの方が自然に感じます。Initializableはなんというかちょっとプリミティブ/具体的すぎてちょっと合わない感じ。
プロトコルがめっちゃ限定的・具体的なことを指示している、みたいな。
もちろん使い方がわかりやすい、とは相反するのですが、実装が変わるとプロトコル名も変わる・あるいはその逆、っていうのはちょっと違和感があります。大きく変わった場合はいいんですけど。
Avatar
kateinoigakukun 30-Sep-20 04:54 AM
Initializableはなんというかちょっとプリミティブ/具体的すぎてちょっと合わない感じ。
これはそうですね。単語のニュアンスを正しく理解できているか自信ないんですが、「Constructする過程でInitializeする」という関係だと思っているので、Initializeをprotocol名に入れるのは珍しいかなとも思いました
(edited)
Avatar
koher 30-Sep-20 04:56 AM
言われてみれば違和感ある気も・・・。
Avatar
tarunon 30-Sep-20 04:57 AM
alloc+initなのはobjcからの流れで
Avatar
kateinoigakukun 30-Sep-20 04:57 AM
ちなみに今のインターフェースのJSValueConstructibleはYamsを参考にしています https://github.com/jpsim/Yams/blob/b9eba20519058266abf6d7e44e82d3d419ce520a/Sources/Yams/Constructor.swift#L105-L116
A Sweet and Swifty YAML parser. Contribute to jpsim/Yams development by creating an account on GitHub.
Avatar
tarunon 30-Sep-20 04:57 AM
他の言語はこの2つを合わせてconstructになってる感じ (edited)
Avatar
koher 30-Sep-20 04:57 AM
API 的に近いのは init(from:) を持つ Decodable
XxxableFromJSValue は良いように思います。 Xxx に何を入れるか。
ConvertibleFromJSValue でもいいのでは?
From が入ればニュアンス変わるし。
JSValueConvertibleConvertibleFromJSValue があっても混乱しなさそう(する?)。
Avatar
kateinoigakukun 30-Sep-20 05:02 AM
そうするとMaxが言うように ConvertibleToJSValueConvertibleFromJSValue にすると対応が取れてきれいな気がするけど、悩ましいな
Decodable はインターフェース的には近いけど意味的にはもう少し小さい粒度の値の変換だからdecodeは微妙にマッチしないかなぁ
Rustだとtrait From<T>trait Into<T> が用意されてて羨ましいな (edited)
👉 1
Avatar
Kishikawa Katsumi 30-Sep-20 05:07 AM
DecodeEncodeはなんとなくSerialiseの要素が含まれる感がありますよね。
Avatar
tarunon 30-Sep-20 05:08 AM
CustomXXConvertibleを見る度に思う > rust裏山
Avatar
kateinoigakukun 30-Sep-20 05:10 AM
参考までにRustの FromInto のドキュメントみてみたんですが
API documentation for the Rust From trait in crate std.
Used to do value-to-value conversions while consuming the input value. It is the reciprocal of Into.
ここではconversionという言葉を使ってますね
やはり ConvertibleFromJSValue かな
Avatar
omochimetaru 30-Sep-20 05:35 AM
自分なら ConvertibleFromJS ConvertibleToJS かなあ〜
Avatar
Kishikawa Katsumi 30-Sep-20 05:38 AM
今回の例でいうとJSValueに関してはEraseToJSValueかなああんまり対称性がなさそう
いや、戻せるから大丈夫なのか。。。?
Avatar
koher 30-Sep-20 05:42 AM
あ、 Decodable は意味は違うけど Xxxable という形式の名前にするのがやはり良さそうという意味でした。で、今考えている init(from:) が( decode ではなく)何かと言うとやっぱり convert だよなと。そうすると ConvertibleFromJSValue かなと。 (edited)
Avatar
tarunon 30-Sep-20 05:44 AM
Convertibleだと、stdlibではCustomStringConvertibleがtoStringが生えますよね。逆にinit(from:String)が生えるprotocolがあればそこが対なので参考にできそう
Avatar
koher 30-Sep-20 05:45 AM
XxxConvertible は to なので、 from であることも明示するには ConvertibleFromXxx かなと。 (edited)
Avatar
tarunon 30-Sep-20 05:45 AM
JSValueConvertibleとJSValueXXXableが定義できると
stdlibの命名に倣えて良いかなと
Avatar
koher 30-Sep-20 05:46 AM
でも from と to が両方存在するなら ConvertibleToJSValueConvertibleFromJSValue がわかりやすそうに思います。
Avatar
tarunon 30-Sep-20 05:46 AM
from toでわかりやすいのは非英語圏な気がする
Convertibleは主格と合わさって意味をなしてるので
fromtoは順番がごちゃった感じがします
Avatar
omochimetaru 30-Sep-20 05:47 AM
CustomStringConvertibleって名前おかしいと思うんだよな Describable じゃないのか (edited)
Avatar
tarunon 30-Sep-20 05:47 AM
(個人の感想)
それはそう
Avatar
omochimetaru 30-Sep-20 05:47 AM
Custom がまず謎だし。
Avatar
koher 30-Sep-20 05:48 AM
そうするとMaxが言うように ConvertibleToJSValue と ConvertibleFromJSValue にすると対応が取れてきれいな気がするけど、悩ましいな
Max が言ってるし別にネイティブでも違和感はない? Max がネイティブかはわからないけど・・・。
Avatar
tarunon 30-Sep-20 05:49 AM
ableはどっちかっていうと最後の方についてる印象がある
Avatar
koher 30-Sep-20 05:49 AM
Xxxable 前置詞 名詞」自体は ExpressibleByStringLiteral とかでもあるし、いい気がします。
Avatar
tarunon 30-Sep-20 05:49 AM
たしかに
Avatar
omochimetaru 30-Sep-20 05:51 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
rintaro 30-Sep-20 05:51 AM
インプットの一つとして、GenericsManifesto では ConstructibleFromValue ってのが出てきます https://github.com/apple/swift/blob/main/docs/GenericsManifesto.md#generic-protocols
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 30-Sep-20 05:51 AM
_ObjectiveCBridgeable は両方向合わせたやつなんだな
Avatar
tarunon 30-Sep-20 05:51 AM
_ObjectiveCBridgeable
こんなのいましたねw
Avatar
omochimetaru 30-Sep-20 05:52 AM
func _bridgeToObjectiveC() -> _ObjectiveCType
static func _forceBridgeFromObjectiveC( _ source: _ObjectiveCType, result: inout Self? )
fromのほうはforceとconditionally と unconditionally があって1:3だった・・・
Avatar
tarunon 30-Sep-20 05:53 AM
完全に相互変換できない場合はそういうインターフェースになると思います
Avatar
kateinoigakukun 30-Sep-20 05:56 AM
ConstructibleFromValue
これは完全にRustの trait From っぽい
個人的には JSValue -> SelfConstructibleFromJSValue or ConvertibleFromJSValue のどちらかかなと思ってるですが、次の問題として、この場合にSelf -> JSValue をstdlibのXxxConvertibleに寄せるか FromJSValueと対応をとって ConvertibleToJSValue にするか。 (edited)
決めの問題なのかなぁ…
Avatar
omochimetaru 30-Sep-20 06:10 AM
stdlibの XxxConvertible は、 String と あと何があるんだっけ
Stringの場合は 元の型と宛先の型のレベルが揃ってないから
情報量を保って表現だけ変える今回の変換は
別物と考えて名前を揃えなくても良い気がする。
Avatar
tarunon 30-Sep-20 06:11 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
XXXConvertibleは、復元不可能な一方通行の場合な気がしてきた
Avatar
omochimetaru 30-Sep-20 06:12 AM
そうそう。
Avatar
kateinoigakukun 30-Sep-20 06:12 AM
CustomPlaygroundDisplayConvertible LosslessStringConvertible CustomDebugStringConvertible
Avatar
tarunon 30-Sep-20 06:12 AM
ReferenceConvertibleというのもありますね
Avatar
omochimetaru 30-Sep-20 06:12 AM
復元可能な場合にわざわざ Lossless が付くことからも
普通のConvertibleは情報の次元が異なってて、
それもあって変換方向が名前から直感的にわかる。
Avatar
kateinoigakukun 30-Sep-20 06:13 AM
public protocol LosslessStringConvertible: CustomStringConvertible { init?(_ description: String) }
Avatar
omochimetaru 30-Sep-20 06:13 AM
descriptionから戻せる太郎ね
Avatar
kateinoigakukun 30-Sep-20 06:13 AM
LosslessStringConvertibleはRawRepresentable where RawValue == String っぽい
Avatar
omochimetaru 30-Sep-20 06:14 AM
一応 Int とかがそうなんじゃないっけ
Avatar
tarunon 30-Sep-20 06:14 AM
Representableが
From相当なのかな
Avatar
omochimetaru 30-Sep-20 06:14 AM
Representableは内部のデータの持ち方じゃない?
Avatar
kateinoigakukun 30-Sep-20 06:15 AM
conformしてるのはBoolとFixedWidthIntegerとString周りだけっぽいですね
A type that can be converted to and from an associated raw value.
RawRepresentableはfromとtoを提供する?
Avatar
tarunon 30-Sep-20 06:16 AM
たしかにtoもありますね
Avatar
kateinoigakukun 30-Sep-20 06:16 AM
内部の持ち方に関しては問わなそう
Avatar
omochimetaru 30-Sep-20 06:17 AM
representationっていうとデータの表現のことを指すからその意味なのかと思ってる
Avatar
tarunon 30-Sep-20 06:17 AM
UIViewRepresentableもあったな
SwiftUIに
Avatar
omochimetaru 30-Sep-20 06:18 AM
UIViewRepresentableは互換性の方の意味っぽいな
Avatar
kateinoigakukun 30-Sep-20 06:18 AM
UIViewBridgableでも違和感ない
Avatar
tarunon 30-Sep-20 06:18 AM
当初の用途見てると、ObjCのenumのマッピングなのだから
互換の意味もありさうだ
Avatar
omochimetaru 30-Sep-20 06:21 AM
APIGuidelineにこういうのは無いんだっけ
ありがちなプロトコル名の命名指針
Avatar
kateinoigakukun 30-Sep-20 06:24 AM
ありそうだな〜と思ってたんですけど見つからない
よくよくありがちなインターフェースだと思うんですけどねー
Avatar
omochimetaru 30-Sep-20 06:25 AM
だよね
最近まさに C# <-> Java を書いてた
Avatar
kateinoigakukun 30-Sep-20 06:31 AM
その場合だとJNIで通信するんですか
Avatar
omochimetaru 30-Sep-20 06:32 AM
そうね。 Java → C# の変換は、C#のコードとして、Javaのオブジェクトのフィールドを読んだりメソッドを呼んだ。JNIをラップしたマシなAPIがあってそれを使った。 https://docs.unity3d.com/ScriptReference/AndroidJavaObject.html
C# → Java の変換はめんどくさかったので Java側にコンストラクタ作ってそれを↑経由で呼んだ。
Java側からC#を触ろうとすると、 P/invoke経由になるけどC interfaceだから Java → JNI/C → C# になってめちゃだるそう
Avatar
kateinoigakukun 30-Sep-20 06:38 AM
これはC#的にはどういう型が返ってくるんだ?
Avatar
omochimetaru 30-Sep-20 06:38 AM
それドキュメントがゴミで
ほんとは Get<FieldType>()
ジェネリックパラメータを一つ取るからユーザ側で明示的に指定する。
Avatar
kateinoigakukun 30-Sep-20 06:39 AM
なーるほどcallerがジェネリックパラメータ渡すのか
そこに渡せるジェネリックパラメータに成約はないんですか? (edited)
Avatar
omochimetaru 30-Sep-20 06:39 AM
ない
多分変なもの書いたらクラッシュする
Avatar
kateinoigakukun 30-Sep-20 06:39 AM
プリミティブな型だけ渡す?
Avatar
omochimetaru 30-Sep-20 06:39 AM
うん。あとプリミティブ配列はイケた。
Avatar
kateinoigakukun 30-Sep-20 06:40 AM
なるほどなぁ。世界観が違うなぁ
Avatar
omochimetaru 30-Sep-20 06:40 AM
あ、あとは、 AndroidJavaObject が書けるよ。
Avatar
kateinoigakukun 30-Sep-20 06:40 AM
AnyObject的な
Avatar
omochimetaru 30-Sep-20 06:40 AM
いや、ちがう
プリミティブが帰ってくるときに AndroidJavaObject を指定するのは駄目
java.lang.Object に対応してるってこと。
javaの int とか booleanObject ではないので。
Avatar
kateinoigakukun 30-Sep-20 06:41 AM
なるほど
Avatar
kateinoigakukun 30-Sep-20 06:48 AM
とりあえずXxxConvertibleに無理に合わせる必要が無いは同意できるのでConstructibleFromJSValueとConvertibleToJSValueかな
👍 1
Avatar
kateinoigakukun 30-Sep-20 07:44 AM
ExpressibleByがリテラル以外でも使われてる例をMaxが教えてくれた
Avatar
kateinoigakukun 30-Sep-20 08:08 AM
I always forget which is which, maybe something like ConvertibleToJSValue and ConstructibleFromJSValue would be more explicit?
Avatar
omochimetaru 30-Sep-20 08:10 AM
いいね。
Avatar
Kishikawa Katsumi 30-Sep-20 08:16 AM
こういうのがリポジトリに残ってるといいですよね
😄 1
Avatar
norio_nomura 30-Sep-20 09:25 AM
YamsのネーミングはPyYAML由来が多いです。
PyYAML由来のRepresenter, Constructorがあっての*Representable,*Constructible
Avatar
kateinoigakukun 30-Sep-20 09:31 AM
なるほど、別言語に起源があったんですね
Avatar
norio_nomura 30-Sep-20 10:38 AM
PyYAMLはYAMLの仕様書で使われているrepresent, constructという単語をそのまま使っている印象です。英語として自然だから偶然揃っているだけかもしれませんが。
Avatar
omochimetaru 30-Sep-20 03:07 PM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
CodingUserInfoKey.init?(rawValue: String) なんですけど
失敗することがないんで、 CodingUserInfoKey.init(rawValue: String) のほうが望ましくないですか?
ちなみに、 init? じゃなくて init であっても、 RawRepresentable にはconformできます。
Avatar
kateinoigakukun 30-Sep-20 03:09 PM
将来的にFailableになることも無さそうだしinitで良さそう
Avatar
omochimetaru 30-Sep-20 03:17 PM
実装当時には推論器がしょぼくて init? で conform できなかった事による名残じゃないかと予想してるんだけど
source breaking changeになるし困ったな
Avatar
Kishikawa Katsumi 02-Oct-20 02:36 PM
Raspberry PiにSwift一式を入れておいたらオフラインでもiPhoneでSwift書ける、みたいな話あった気がするな
Avatar
kateinoigakukun 02-Oct-20 03:10 PM
Playground.app on iPhoneだ
Avatar
Kishikawa Katsumi 02-Oct-20 03:36 PM
電源の問題があるな。iPhoneから取れるといいんだけどな。。。
Avatar
niw 02-Oct-20 08:25 PM
別に審査にださないんだったら
なんでもできるんじゃないですかね。Raspberry Piなしに。
Sandboxだけど。
Avatar
Kishikawa Katsumi 02-Oct-20 08:38 PM
SwiftツールチェーンをiOSで動くようにビルドするのは難しいかと思って。。
Avatar
niw 02-Oct-20 08:38 PM
Windowsだってうごくので、Swiftなんてかんたんに動くと思う!
Avatar
Kishikawa Katsumi 02-Oct-20 08:40 PM
Appleシリコンのサポートもあるから意外といけるか?
Avatar
kebo 05-Oct-20 02:13 PM
ios_system で LLVM は動くようにできている (かつ a-Shell というアプリで App Store にも通っている) ので、Swift ツールチェーンも行けるかもと思ったことはありますね。(実際にやってはいないですが) https://github.com/holzschu/ios_system https://github.com/holzschu/llvm (edited)
Drop-in replacement for system() in iOS programs. Contribute to holzschu/ios_system development by creating an account on GitHub.
Mirror of official llvm git repository located at http://llvm.org/git/llvm. Updated every five minutes. - holzschu/llvm
😮 2
Avatar
Kishikawa Katsumi 09-Oct-20 10:59 AM
AST Explorerでどの文法要素がどれだけ使われてるかと、ポイントしたらどこに使われてるかわかる機能つけた。たぶん最初のとっかかりの学習に便利。
Avatar
koher 09-Oct-20 11:05 AM
これよさそうですね。
僕みたいな( SwiftSyntax の?)初心者に。
Avatar
Kishikawa Katsumi 09-Oct-20 11:12 AM
そうそう。そういう本当に最初のとっかかりで全体を俯瞰したりどういう構造が取れるかみたいなのがたぶんわかる。
🙂 1
Avatar
あきと 14-Oct-20 01:48 AM
いつもお世話になってます。 これめちゃくちゃいいですね!参考にしたいアプリのサンプルコードとか、作ってるアプリのコード一気に復習したいときに便利そうです!
Avatar
Kishikawa Katsumi 18-Oct-20 12:05 AM
https://swiftfiddle.com/ Swift PlaygroundをVaporで書き直してついでに全部Dockerで動く構成にしてセットアップが簡単になったから2.2とかの手に入る実行環境を全部入れてみた。 2.xで動かそうとするとFoundationがないとか最初の引数にラベルをつけたらダメとかまずコンパイルが全然通らなくて懐かしい気持ちになる。
SwiftFiddle is an online playground for creating, sharing and embedding Swift fiddles (little Swift programs that run directly in your browser).
Avatar
koher 18-Oct-20 12:51 PM
全部Dockerで動く構成にして
Swift のコードをコンパイルして実行する部分が Docker in Docker になっちゃいませんか?
Avatar
Kishikawa Katsumi 18-Oct-20 01:56 PM
はい。Swiftの実行をサンドボックス化するためにDocker in Docker構成は必要ですね。 (edited)
Avatar
koher 18-Oct-20 02:05 PM
Docker in Docker ってやったことがなくて知見がないんですが、軽く調べたときは --privileged を付与しないといけないとかあって危険そうでやめちゃったんですが、特に問題ない感じですか? (edited)
Avatar
Kishikawa Katsumi 18-Oct-20 02:18 PM
DinDとDooDという2つの手法があってDooDだとprivileged はいらないです。でもどちらにしてもコンテナで動かすのはコンテナの寿命も短いし、コンテナごとにリソース制限もできるからDinDでもはるかに安全だと思います。
Avatar
koher 18-Oct-20 02:26 PM
僕が作ったときは受け取ったコードを走らせる部分だけをコンテナで動かして、クライアントとやりとりするサーバーサイドプログラムはあきらめて Docker の外側で動かしてました。管理しやすいからそこも Docker にしたいんですが・・・。 DooD なら問題ないですかね?↓とかが気になってます・・・。
ホストマシンで動いてる他の Docker コンテナも見えちゃうので、例えば Jenkins コンテナ上で他の Jenkins コンテナを停止できてしまいます。
https://qiita.com/sugiyasu-qr/items/85a1bedb6458d4573407
Avatar
Kishikawa Katsumi 18-Oct-20 02:37 PM
ホストマシンで動いてる他の Docker コンテナ〜
専門じゃないですけどこれが第三者に可能ならそれは別の大きな問題じゃないですかね。 確かにDood構成だとホストのDocker Daemonを共有するので子や孫のコンテナの中からdocker stopやrmは可能です。概念上は親子孫。。。とありますけど全部並列というのがたぶん正確。
いずれにしてもコードを実行する部分はコンテナでやるのがベスト、ここは同意できる部分と思います。 あとはある意味構成が複雑になるので私も最初は避けてたんですけど、やっぱりセットアップが大変なので、Docker In Docker構成だとすごい楽ですね。
Avatar
rinsuki 18-Oct-20 02:39 PM
DooDだと /var/run/docker.sock 触れる = それがあるなら --privileged な docker コンテナも作れるのでむしろ DinD のほうがちょっと安全…?
👀 1
Avatar
Kishikawa Katsumi 18-Oct-20 02:40 PM
外の人がWebサービス越しにそれをやるのはだいぶ困難じゃないですかね。
Avatar
rinsuki 18-Oct-20 02:41 PM
まあそれはそうだと思います
Avatar
Kishikawa Katsumi 18-Oct-20 02:41 PM
コンテナでデプロイできるとOSも特殊なコンテナ用のOSが使えるのでそこも安全性に寄与する部分がありそう。
Avatar
koher 18-Oct-20 02:42 PM
いずれにしてもコードを実行する部分はコンテナでやるのがベスト、ここは同意できる部分と思います。
はい、これは必須だと考えています。
Avatar
Kishikawa Katsumi 18-Oct-20 02:42 PM
SwiftFiddleはGCEのContainer Optimized OSにデプロイしてて、普通に入っても一般のUbuntuとかとはだいぶ勝手が違うので。
Avatar
koher 18-Oct-20 02:44 PM
外の人がWebサービス越しにそれをやるのはだいぶ困難じゃないですかね。
コードからコマンド実行したりできるから、結構色んなことできませんか?権限をうまく管理すれば良い?穴があると怖いから何されても大丈夫にしておきたくて、そうすると外側は Docker に載せない方がいいのかなぁとか考えてました。
Avatar
Kishikawa Katsumi 18-Oct-20 02:52 PM
おっしゃる通り、自分のコードにバグがあってコマンドインジェクションとかが一番簡単な脆弱性ですね。。。 その場合はどうなのかなあ。 ユーザーを制限して普通にホストでサービスを動かす方がいいんだろうか。
いい、というのはより安全、という意味です。構成は複雑になるけど管理は全部Dockerの方が楽なのはそうなので、どっちがどれくらい危険なのかなあ。
Avatar
koher 18-Oct-20 02:56 PM
そうなんですよねぇ。管理は Docker でできたら楽なので、できるならそうしたいです・・・。
Avatar
Kishikawa Katsumi 18-Oct-20 02:56 PM
ある程度任意のコードが実行できて、SwiftFiddleはHTTP通信もできるようにしてるけど、他はコンテナに制限かけてるからまず外側の構成によらずそんなに簡単に何でもできない、気はしている。
Avatar
norio_nomura 19-Oct-20 01:20 AM
とりあえず、Dockerfile内で外向けアプリを実行する前にUSERでアカウントを変更した方が良いです。
Avatar
Kishikawa Katsumi 19-Oct-20 01:37 AM
ホストのdocker.sockにアクセスできない問題が解決できなかったんですよね。通常ユーザーでどうしたら可能になるのでしょうか?
Avatar
Avatar
koher 25-Oct-20 03:11 PM
↑のツイートを見て考えてたんですけど、 Swift においてもこれがアンチパターンかって結構難しいテーマじゃないですか?
正常系に例外を使うなっていう話って Java の事情の影響を相当受けてる気がして、実際 Effective Java の「例外的状態にだけ例外を使う」という項を読んでも、ほとんどパフォーマンスの話しかしていません。
Swift の throws はより軽量だと思いますし、また、例外を throw するのは Either / Result に対する do 記法だという立場からすると、 treat が例外を throw するのと結果を return するのは同じことだとも言えます。
一方で、 can_treat を使う方式だと、チェック忘れを静的に検査できず treat が実行時エラーを起こす可能性を排除できません。
Effective Java では、 Iteratornextthrow して分岐するか、 hasNext でチェックするまたは nextOptional を返すかという話が載っていて後者が望ましいとあるんですけど、 OptionalResult の一種だと考えると、 throw するか Optionalreturn するのは同じことだとも言えます。 (edited)
Avatar
Kishikawa Katsumi 25-Oct-20 03:47 PM
Javaの話を根拠にするのはSwiftには当てはまらないと思います。おっしゃる通り、例外のパフォーマンスが全然違うので。
Avatar
koher 25-Oct-20 03:54 PM
ただ、「正常系に例外を使うな」という話はパフォーマンスの話を越えてより普遍的なものとして広がっているような印象を持ってるんですけどどうでしょう?
Avatar
Kishikawa Katsumi 25-Oct-20 03:58 PM
Javaからきているその話は(他の言語からの由来があるかもしれないけど置いておく)、多分にJavaの例外のパフォーマンスの問題(スタックトレースをキャプチャするコストが高い)と一部の標準ライブラリの設計の問題、からきているので、Javaの文脈を超えて「正常系で例外を使う」というのが一人歩きしていそうな場合は (edited)
まあ何でダメと言ってるのか、というところからじゃないでしょうか。なのでおっしゃる通りSwiftの場合はOKなこともあるんじゃないか、というのには同意します。
Avatar
omochimetaru 25-Oct-20 03:59 PM
実践的には例外は異常系だけに使っておいたほうが嬉しいことは多いと思います。 ソフトがなんかバグってるけどとっかかりがない、みたいなときに、例外生成にブレークポイントを貼ると便利ですけど、正常系で使ってるとそこに止まりまくってそういう技ができなくなるとか、 異常系は正常系より低頻度なので、コンパイラが分岐予測ヒントを与える最適化ができるけど正常系で例外を使うとそれとアンチシナジーしちゃうとか。
Avatar
Kishikawa Katsumi 25-Oct-20 03:59 PM
たぶんに言語ごとの実装による、気がしますね。
例外生成にブレークポイントを貼ると便利ですけど、正常系で使ってるとそこに止まりまくってそういう技ができなくなるとか
これがツラいのは確かにありますね。
Avatar
omochimetaru 25-Oct-20 04:00 PM
Swiftで型安全な2択分岐をさせたいならenumを使えばよいというのもあって、わざわざ例外を正常系に使うテクがそこまで嬉しいことは少ない気がする。
Avatar
koher 25-Oct-20 04:03 PM
treat の戻り値の型が Void だったときに、 throws なら分岐を強制できるけど、 Bool か二値 enum だと警告止まりというのはどうでしょう?
Avatar
kateinoigakukun 25-Oct-20 04:05 PM
FYIなんですが、Sequence.firstの実装が正常系でthrowを使っていた過去がありますが、おもちさんが挙げているようなブレークポイントの問題を理由に書き換えられています。 https://github.com/apple/swift/pull/17387
This PR alters the Sequence.first(where:) function to remove the use of a thrown error for flow control. When called under Xcode with the &quot;Swift Error Breakpoint&quot; (swift_willThrow...
👀 3
Avatar
omochimetaru 25-Oct-20 04:08 PM
元の漫画の左のコードはcan_treatとtreatのペアの規約が難しいけど、右もpythonなら非検査例外だから、どちらもtreatの仕様書を読み込んでから使わなきゃいけないしどっちもつらい
Avatar
koher 25-Oct-20 04:12 PM
@kateinoigakukun これおもしろい事例ですね。
@omochimetaru Python においては右も辛いはそのとおりだね。
Avatar
koher 27-Oct-20 02:15 PM
@swift-5.3.3
var a: ArraySlice<Int> = [] for i in 0 ..< 100 { a.append(i) print(a.capacity) }
Avatar
swift53 BOT 27-Oct-20 02:15 PM
1 3 3 7 7 7 7 17 17 17 17 17 17 17 17 17 17 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143
Avatar
koher 27-Oct-20 02:15 PM
おや?手元環境と違う。
@swift-5.3.3
var a: ArraySlice<Int> = [] for i in 0 ..< 100 { a.append(i) print(a.capacity) _ = a.popFirst() }
Avatar
swift53 BOT 27-Oct-20 02:15 PM
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Avatar
koher 27-Oct-20 02:16 PM
↑これすごく意外でした。 capacity を超えそうのなったときに前に詰めてる?
@swift-5.3.3
var a: ArraySlice<Int> = [] a.reserveCapacity(10) for i in 0 ..< 20 { a.append(i) print(a.capacity) _ = a.popFirst() }
Avatar
swift53 BOT 27-Oct-20 02:19 PM
11 10 9 8 7 6 5 4 3 2 1 1 1 1 1 1 1 1 1 1
Avatar
koher 27-Oct-20 02:20 PM
これ一つずつ減っていくのどういうこと?
Avatar
omochimetaru 27-Oct-20 02:21 PM
スライスのcapacityは (Arrayのend - スライスのstart) になってそう。
popFirstはスライスのstartを1増やしてる。
Avatar
koher 27-Oct-20 02:23 PM
うーん、そうなのか。そうすると capacity からバッファのサイズはわからないな。
Avatar
omochimetaru 27-Oct-20 02:23 PM
スライスの要素数が0個になったあとまたappendしたときは
0個になった時点で実体のArrayを手放してるんじゃないかなあ?
それでまた要素数1のArrayというかバッファーを新規作成している?
Avatar
koher 27-Oct-20 02:24 PM
あふれて allocate するときもそうだと思う。
Avatar
omochimetaru 27-Oct-20 02:24 PM
そのときは既存部分のクローニングが要りますね。
Avatar
koher 27-Oct-20 02:24 PM
そうですね。
それは Array でもそうかと。 < 既存部分 (edited)
Avatar
omochimetaru 27-Oct-20 02:25 PM
そうですね。
Avatar
koher 27-Oct-20 02:27 PM
appendpopFirst を繰り返した場合、 endIndexcapacity を超えたときにどうなると思う?前に詰める? N 倍のバッファを確保して index に基づいた場所に格納される?
capacity からわかるかと思ったけど、この capacity の挙動だと実装みないとわからないかな・・・。
Avatar
omochimetaru 27-Oct-20 02:34 PM
expandされると思ってたけど、この結果からすると0になったときに捨てて1のバッファを作ってそう
要素1の配列はヒープ退避されない最適化実装があった気がする
CollectionOfOneだったかなんか。 (edited)
Avatar
koher 27-Oct-20 02:40 PM
ただそれだとオフセットがいるからすべての操作にたし算が入って若干遅くなるよね。
ポインタだけオフセット分前にずらしておけば大丈夫? (edited)
Avatar
omochimetaru 27-Oct-20 03:09 PM
ズラしておいてメタデータはマイナスとか後ろに持つというのもあるけど、小さな定数のオフセットって1命令に焼けるから実質コスト無いとかもありそう
Avatar
koher 28-Oct-20 01:12 AM
この「定数」は実行時定数?それともコンパイル時?あと、「小さな」が、 ArraySlice をキューとして使っていたとすると大きなオフセットになることはありえそう。
Avatar
omochimetaru 28-Oct-20 03:28 AM
対象読者 アセンブリに触れてみたい!という初心者の方 メモリ、アドレスといった専門用語、C言語の簡単な文法(intやprintf)がわかる(ググって調べることができる) 目標 ソースコード, .sファイル, 実行可能ファイ...
mov eax, [ebx+8]
この形式の事を言ってました
👀 1
ここの8がオフセット定数 命令における定数なので実行時ですね
小さな、というのはここのオフセット定数に使えるビット幅が小さいのでそれに収まるという意味
CollectionOfOneの先頭から値へのオフセットのことを考えてました
CollectionOfOneはバッファを間接化しないので。
Avatar
koher 05-Nov-20 02:26 PM
a ... bb == a - 1 のときに、実行時エラーじゃなくて空の ClosedRange になってほしい・・・。
Avatar
Kishikawa Katsumi 05-Nov-20 02:47 PM
実行時エラーがツラいっすよねえ。
Avatar
koher 06-Nov-20 03:11 AM
a ..< b だと空の Range 作れるんですよね。
Avatar
koher 06-Nov-20 03:21 AM
@swift-5.3.3
print(Array(0 ..< 0))
Avatar
swift53 BOT 06-Nov-20 03:21 AM
[]
Avatar
koher 06-Nov-20 03:22 AM
@swift-5.3.3
print(Array(1 ... 0))
Avatar
swift53 BOT 06-Nov-20 03:22 AM
exit status: 4 with stderr:
Fatal error: Can't form Range with upperBound < lowerBound: file Swift/ClosedRange.swift, line 335 Current stack trace: 0 libswiftCore.so 0x00007f0b11e99d50 swift_reportError + 50 1 libswiftCore.so 0x00007f0b11f0d0c0 _swift_stdlib_reportFatalErrorInFile + 115 2 libswiftCore.so 0x00007f0b11bf27de <unavailable> + 1398750 3 libswiftCore.so 0x00007f0b11bf2337 <unavailable> + 1397559 4 libswiftCore.so 0x00007f0b11bf2013 <unavailable> + 1396755 5 libswiftCore.so 0x00007f0b11bf1a80 _assertionFailure(_:_:file:line:flags:) + 511 7 swift 0x00000000005b4501 <unavailable> + 1787137 8 swift 0x00000000005a1d04 <unavailable> + 1711364 9 swift 0x0000000000587e88 <unavailable> + 1605256 10 swift 0x000000000057b322 <unavailable> + 1553186 11 swift 0x00000000005780ef <unavailable> + 1540335 12 swift 0x0000000000501c2c <unavailable> + 1055788 13 libc.so.6 0x00007f0b13f68740 __libc_start_main + 240 14 swift 0x00000000005017a9 <unavailable> + 1054633 Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret - -disable-objc-interop -I /Libraries/.build/x86_64-unknown-linux-gnu/debug -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/CSwiftBacktrace/include -I /Libraries/.build/checkouts/SwiftBacktrace/Sources/Clibunwind/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOHTTPParser/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOSHA1/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOAtomics/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIOWindows/include -I /Libraries/.build/checkouts/swift-nio/Sources/CNIODarwin/include -I
Avatar
koher 06-Nov-20 03:22 AM
@swift-5.3.3
print(Array(0 ... 0))
Avatar
swift53 BOT 06-Nov-20 03:22 AM
[0]
Avatar
rintaro 06-Nov-20 03:29 AM
https://github.com/apple/swift/blob/e8151ee2b27776f684464af8b26fe33767d966b5/stdlib/public/core/ClosedRange.swift#L90-L95
/// Because a closed range cannot represent an empty range, this property is /// always `false`. @inlinable public var isEmpty: Bool { return false }
なんで、無理ですね
Avatar
koher 06-Nov-20 03:37 AM
そうなんですが、結構不便なんですよねぇ・・・。
たとえば nPr を計算する関数なんかは↓のように実装したくなると思うんですが、 r0 だとクラッシュしてしまいます。
func npr(_ n: Int, _ r: Int) -> Int { (n - r + 1 ... n).reduce(into: 1) { $0 *= $1 } }
仕方なく↓みたいに書くんですが、 ..< の右の n + 1 が不格好なんですよね・・・。
func npr(_ n: Int, _ r: Int) -> Int { (n - r + 1 ..< n + 1).reduce(into: 1) { $0 *= $1 } }
競プロで ... 使うと実行時エラーを踏みまくるので、 ..< ばかり使うようにしています。
Avatar
rintaro 06-Nov-20 03:45 AM
lowerBound > upperBound のものをすべて空として扱うのは乱暴な気がするし、Strideable じゃないものだと空として扱うupperBoundが決められないし、仕方ない気もします。
Avatar
koher 06-Nov-20 03:46 AM
lowerBound == upperBound + 1 の場合だけ空だと、実用上はちょうど良いように思います。ただ、表現として微妙なのはわかります。
Strideable じゃない場合との整合性を考えると微妙ですね・・・。 (edited)
Avatar
Kishikawa Katsumi 16-Nov-20 05:00 AM
https://twitter.com/twolivesleft/status/1328178489258692608 これはアリだと思うんですよね。オーバーロードでやるんじゃなくてフォントがそういう風に表示したらいいと思うけど。。。
Reading some library code … found this Not sure what to think
Likes
311
Avatar
freddi 16-Nov-20 05:19 AM
これは確かにアリだ
Avatar
Kishikawa Katsumi 16-Nov-20 05:21 AM
リガチャで見た目変えるフォントを使っても != を≠にするのはあるけど否定のビックリをみやすくしてくれるのはなかった気がする。
Avatar
niw 16-Nov-20 05:22 AM
!!! にすればいいんですよ
奇数個強調したい分だけ繰り返せばよい
Avatar
Kishikawa Katsumi 16-Nov-20 05:23 AM
なんと。確かにそれでいい気もするなあ。
Avatar
freddi 16-Nov-20 05:24 AM
個人的には not みたいなキーワードがほしいですねえ (edited)
Avatar
rintaro 16-Nov-20 06:33 AM
error: cannot find operator '!!!' In scope カスタムオペレーターの弊害とはいえ、悲しい。
Avatar
omochimetaru 16-Nov-20 06:34 AM
うっかり4個書いたらバグるやんけ > niw
😂 1
Avatar
niw 16-Nov-20 07:01 AM
それはどの記号でも同じだから...
数は重要
Avatar
omochimetaru 16-Nov-20 07:01 AM
単項演算子を2回重ねることがまずない
Avatar
niw 16-Nov-20 07:02 AM
JavaScriptでは当たり前にように使う
Avatar
omochimetaru 16-Nov-20 07:02 AM
bool castするやつですよね
Avatar
niw 16-Nov-20 07:02 AM
てか !!! だめなのかー
bool への cast で !! なのは C とかでもあるはず
Avatar
omochimetaru 16-Nov-20 07:04 AM
Cならそのままでよくないですか?
JSだと後続の処理に渡る値の型を固定させたいことがあるけどCは静的型だから。
Avatar
niw 16-Nov-20 07:05 AM
なんかあったはず
macroがらみだったかなあ
あんま覚えてない
Avatar
omochimetaru 16-Nov-20 07:05 AM
マクロならなんかありそう。 そういうマクロはよくない。
Avatar
niw 16-Nov-20 07:06 AM
あー、bitflagか
Avatar
masakihori 16-Nov-20 07:14 AM
!の視認性の悪さが問題なのに!!!にしたら数を数えないといけないという地獄度が増してる気がする
乱視なので!は基本的に2本以上見えてる
Avatar
omochimetaru 16-Nov-20 07:14 AM
それは困りそう>乱視
Avatar
niw 16-Nov-20 07:16 AM
そもそもなんで ! が否定なんだろう
Avatar
omochimetaru 16-Nov-20 07:17 AM
もともと 数学の を表したくて、 縦棒っぽい記号が欲しかっただけと思ってた !=
Avatar
niw 16-Nov-20 07:17 AM
≠ → != → !
Avatar
omochimetaru 16-Nov-20 07:17 AM
で、そこから +=+ の関係を考えると、 != から ! が取り出せる
Avatar
niw 16-Nov-20 07:17 AM
ほう。。
Avatar
omochimetaru 16-Nov-20 07:18 AM
数学の not は ¬
Avatar
niw 16-Nov-20 07:19 AM
bang pで!が...
Avatar
omochimetaru 16-Nov-20 07:19 AM
それはプログラミング言語由来として載ってる感じだった
Avatar
niw 16-Nov-20 07:19 AM
なるほど輸入されたのか
The exclamation mark "!" signifies logical NOT in B, C, and languages with a C-inspired syntax such as C++, Java, JavaScript, Perl, and PHP. "NOT" is the operator used in ALGOL 60, BASIC, and languages with an ALGOL- or BASIC-inspired syntax such as Pascal, Ada, Eiffel and Seed7. Some languages (C++, Perl, etc.) provide more than one operator for negation. A few languages like PL/I and Ratfor use ¬ for negation. Some modern computers and operating systems will display ¬ as ! on files encoded in ASCII.
B由来っぽい
Avatar
masakihori 16-Nov-20 07:28 AM
ネタとしてはこうですよね。 extension Bool { var isFalse: Bool { !self } }
リガチャで読みやすく(?)するフォントはgithubにあります
Free monospaced font with programming ligatures. Contribute to tonsky/FiraCode development by creating an account on GitHub.
Avatar
omochimetaru 16-Nov-20 07:32 AM
1文字の ! はないっぽい?
Avatar
Kishikawa Katsumi 16-Nov-20 07:55 AM
はー、トリプルビックリはダメなのか😯
そもそもダブルビックリもだめなのか。
juxtaposeって英単語エラーメッセージで初めて知った。近すぎる、らしい。 (edited)
Avatar
norio_nomura 18-Nov-20 03:47 AM
ci.swift.orgにApple Siliconなノードはまだ入らないのかな。 (edited)
Avatar
omochimetaru 13-Dec-20 09:58 AM
こうした外部要因だけでなく、内部的にも「Swift派」と「Objective-C派」に派閥の分裂が生じていたとのこと。Swift派はSwiftに執着して問題を否定し、Objective-C派は解決策を提示せず不平のみ発するようになり、社内は緊張状態になっていたとStanley氏は語っています
😭 2
Avatar
niw 13-Dec-20 06:27 PM
どちらももと同僚なんだよなあ。なつい。
TwitterはSwiftこれ系はうまく乗り切ったと思う。
Avatar
omochimetaru 13-Dec-20 06:28 PM
ウーバーからniwさんのところに転職したってことですか?
Avatar
niw 13-Dec-20 06:28 PM
彼は元Twitter
Avatar
omochimetaru 13-Dec-20 06:28 PM
あ、ウーバーに行ったのか。
Avatar
niw 13-Dec-20 06:29 PM
Lorenも。
Avatar
omochimetaru 13-Dec-20 06:29 PM
ああ、記事に名前出てくる二人
Avatar
niw 13-Dec-20 06:29 PM
そう。
Avatar
omochimetaru 13-Dec-20 06:30 PM
標準ライブラリが入ってたとしても100M超えるのは違和感がある
Avatar
niw 13-Dec-20 06:30 PM
今にして思えば同時のiOSチームリードの判断と割とコンサバティブな弊社の決断は正しかった
Avatar
omochimetaru 13-Dec-20 06:30 PM
めっちゃたくさんライブラリ入れてたんだろうか
Avatar
niw 13-Dec-20 06:30 PM
特に前者
いろいろリンクしてたんだろうなあ。
Principal か、めっちゃ出世してるやん
Avatar
tarunon 14-Dec-20 01:05 AM
UberはRxSwiftを基盤にしたFramework作ってませんでしたっけ
Avatar
koher 06-Jan-21 04:56 AM
Swift の protocol 作るときに、型ではなく制約としての利用を前提とするなら、基本的に FooProtocol の命名の方が良い気がするんですがどうでしょう?
protocol Foo {} struct Bar<???: Foo> {} // ??? に何と付ける?
protocol FooProtocol {} struct Bar<Foo: FooProtocol> {} // 型パラメータ名を Foo にすれば良い
(edited)
Numeric みたいな汎用的なプロトコルの場合は struct Bar<Length: Numeric> みたいに命名できるけど、もっと用途の幅が狭いものの場合。 (edited)
Avatar
omochimetaru 06-Jan-21 04:58 AM
Barの中でFooをどう使うかで名前が付きません? var value: Value とか。
Avatar
koher 06-Jan-21 05:00 AM
そういう名付けができるケースだといいけど、もっと用途が限定されてる場合とか。今は VideoSource というプロトコルを作ってたんだけど、
struct PlayerView<VideoSource: VideoSourceProtocol>: View { ... }
にしたくなった。
Avatar
omochimetaru 06-Jan-21 05:01 AM
そのケースは確かに・・・
Avatar
niw 06-Jan-21 05:02 AM
VideoSource_ (edited)
Avatar
kateinoigakukun 06-Jan-21 05:02 AM
VideoSourceType
Avatar
niw 06-Jan-21 05:02 AM
TypeOfVideoSource
Avatar
omochimetaru 06-Jan-21 05:02 AM
たしかにassociatedtypeだと Type suffix 結構使うな。 (edited)
パラメータ名は別に大事じゃない気がしてて V: VideoSource で良い気もするんだけど主流じゃなさそうだ。
Avatar
niw 06-Jan-21 05:04 AM
T, U, V...
Avatar
koher 06-Jan-21 05:04 AM
制約としてのプロトコルって書く場所があまりないけど、 associatedtype や型パラメータって何度も繰り返し使われるから、 associatedtype Iterator: IteratorProtocol 的にプロトコル名を長くした方がよくないですか?
Avatar
niw 06-Jan-21 05:04 AM
associatedtype はそうかも。 (edited)
Avatar
omochimetaru 06-Jan-21 05:04 AM
Protocol suffixはなんか負けた気がするんですよね
結構使うけど・・
Avatar omochimetaru
Protocol suffixはなんか負けた気がするんですよね
Avatar
kateinoigakukun 06-Jan-21 05:05 AM
わかる。。
Avatar kateinoigakukun
わかる。。
Avatar
niw 06-Jan-21 05:05 AM
わかる
Avatar
omochimetaru 06-Jan-21 05:05 AM
ハンガリアンっぽいというか。 (edited)
Avatar
niw 06-Jan-21 05:05 AM
(ハンガリアンてハンガリー関係あるんだっけ)
Avatar niw
T, U, V...
Avatar
koher 06-Jan-21 05:05 AM
関数やメソッドではなくジェネリック型の型パラメータの場合は T などではないフルの名前がメジャーかと思います。
Avatar koher
関数やメソッドではなくジェネリック型の型パラメータの場合は T などではないフルの名前がメジャーかと思います。
Avatar
niw 06-Jan-21 05:06 AM
たしかに!
(考案者がハンガリー出身...)
Avatar omochimetaru
Protocol suffixはなんか負けた気がするんですよね
Avatar
koher 06-Jan-21 05:06 AM
そうなんだけど、 IteratorProtocol があるからもう天下り的にいいかなと・・・。
プロトコルを型として使わないんだったら、 C# 的な I prefix は賢い気がする。
Avatar
niw 06-Jan-21 05:07 AM
語尾を変えてキャラクターを持たせるのは日本語あるあるなので
ジャパニーズ記法としよう
😂 2
Avatar
koher 06-Jan-21 05:08 AM
ハンガリアン記法ってかっこいいけどジャパニーズ記法ってクソダサですね💧
Avatar
omochimetaru 06-Jan-21 05:48 AM
異なる2つのものが同じ名前を持っているときに、ユーザーがprefixやsuffixをつけるのではなくて、
文法的になんの名前なのかを修飾できる言語機能をもたせる方向性のほうが好きです
C++だと typename キーワードでそういう事をする場面があって
C++でtypenameキーワードを使うケースは以下の2つがある. テンプレートパラメータを宣言するとき テンプレート内にあるネストされた依存型名を指定するとき(例外あり) テンプレートパラメータの宣言時 ひとつはテンプレートパラメータを宣言するとき. template void f(T t); これは,以下のようにtypenameの代わりにclassを使った場合でも同じ意味となる. template void f(T t); この場合,typenameとclassのどちらのキーワードを使うかは好みの問題となる. テンプレートにネストされた型の指定時 …
どうしても無理ならこういう方向にいって、ユーザーの命名で固定のsuffixをいつもつけるとかは避けられるようになってほしい
Avatar
niw 06-Jan-21 05:51 AM
2. 知らなかった...!
Avatar
nanasi 06-Jan-21 08:21 AM
省略形にしたくないときはモジュール名つけるのをよくやっています
struct Bar<Foo: MyModule.Foo> {}
Avatar nanasi
省略形にしたくないときはモジュール名つけるのをよくやっています
struct Bar<Foo: MyModule.Foo> {}
Avatar
koher 06-Jan-21 10:20 AM
これコード読んでるときにややこしいかなぁと思ってたんですが、 Opaque Result Type を考えると型名としてプロトコル名が現れることもあるなという気持ちになって、結局この方法を採用しました。
Avatar
norio_nomura 09-Jan-21 01:30 AM
https://github.com/MaxDesiatov/SwiftConcurrencyExample これ試したけど、/usr/lib/swift/libswift_Concurrency.dylibが絶対パスでリンクされて、SIP有効だとDYLD_LIBRARY_PATHも渡せないから、
dyld: Library not loaded: /usr/lib/swift/libswift_Concurrency.dylib
で実行出来なかった。 (リポジトリ名が変わっていたので修正した)
(edited)
Experiments with Swift async/await and structured concurrency - MaxDesiatov/SwiftConcurrencyExample
Avatar
kateinoigakukun 09-Jan-21 01:45 AM
なぜかはちゃんと分かってないんですが、XcodeのRun経由だとdylibが正しく読み込めて実行できるですよねこれ。
Avatar
norio_nomura 11-Jan-21 04:51 AM
ああ、DYLD_LIBRARY_PATH=… swift runはダメだけど、DYLD_LIBRARY_PATH=… .build/x86_64-apple-macosx/debug/ConcurrencyExampleとして直接実行するのはイケた。SIP関係ないのかな?
Avatar
norio_nomura 11-Jan-21 05:20 AM
インストーラを介してインストールされた実行ファイルに、SIPは環境変数DYLD_LIBRARY_PATHを渡さないようにしてるのかな? 何か条件があるぽい。
$ env DYLD_LIBRARY_PATH=hoge /usr/bin/python3 -c "import os;print('DYLD_LIBRARY_PATH' in os.environ)" False $ env DYLD_LIBRARY_PATH=hoge /usr/local/bin/python3 -c "import os;print('DYLD_LIBRARY_PATH' in os.environ)" True
(edited)
Avatar
rinsuki 11-Jan-21 06:41 AM
/usr/bin/* のバイナリにDYLD系envが使えないっぽいんですよね (適当なところにcpすると動く)。SIPで制限されてるフォルダにあるバイナリはだめとかなのかな
Avatar
niw 11-Jan-21 06:43 AM
あー、だめそう
iTunesとかもだめそう
debuggerがアッタッチできなければSIPの影響下だと思う
Avatar
norio_nomura 11-Jan-21 07:27 AM
PATH$HOME/Library/Developer/Toolchains以下にインストールしたSwiftツールチェインの/usr/binを通してDYLD_LIBRARY_PATH=… swift runしてもダメなんですよね。なので「インストーラで入れた」が条件なのかな?と。
Avatar
niw 11-Jan-21 07:34 AM
なにか xattr ついてないですか? (edited)
Avatar
norio_nomura 11-Jan-21 09:58 AM
何もついてないですね。
Avatar
norio_nomura 11-Jan-21 10:08 AM
親ディレクトリから辿っても、怪しいのは無さげ。
$ xattr -rv ~/Library/Developer/Toolchains/|grep -v -E "com.apple.(cs.Code(Directory|Requirements|Requirements-1|Signature)|metadata:com_apple_backup_excludeItem|FinderInfo)"|wc -l 0
(edited)
Avatar
kateinoigakukun 11-Jan-21 10:09 AM
署名されてるとダメとか…?
Avatar
norio_nomura 11-Jan-21 10:16 AM
試しに.build/x86_64-apple-macosx/debug/ConcurrencyExampleをDeveloper ID Applicationで署名してみましたが、DYLD_LIBRARY_PATHは通りました。
$ swiftnightly build [1/1] Planning build [3/3] Linking ConcurrencyExample * Build Completed! $ codesign -s "Developer ID Application: Norio Nomura (PK9GMQ772L)" .build/debug/ConcurrencyExample $ codesign -vv .build/debug/ConcurrencyExample .build/debug/ConcurrencyExample: valid on disk .build/debug/ConcurrencyExample: satisfies its Designated Requirement $ DYLD_LIBRARY_PATH=~/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2021-01-09-a.xctoolchain/usr/lib/swift/macosx .build/debug/ConcurrencyExample task started { "uuid": "32cf6d86-bb2d-4089-8262-9ecfcf9d7418" } end of main
Avatar
koher 22-Jan-21 07:58 AM
mealHandle() の間に .get が抜けてる?
func eat(mealHandle: Task.Handle<Meal, Error>) { let meal = try await mealHandle() meal.eat() // yum }
https://github.com/DougGregor/swift-evolution/blob/structured-concurrency/proposals/nnnn-structured-concurrency.md
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - DougGregor/swift-evolution
Avatar
kateinoigakukun 03-Feb-21 06:21 AM
@swift-5.4.3 @swift-5.3.3
let a: [String?:String] = ["Foo":"Bar"] let b = a as [AnyHashable:String] print(b["Foo"] == "Bar") print(b["Foo" as String?] == "Bar")
Avatar
swift54 BOT 03-Feb-21 06:21 AM
false true
Avatar
swift53 BOT 03-Feb-21 06:21 AM
true false
Avatar
kateinoigakukun 03-Feb-21 06:23 AM
dynamic castのリファクタリングでOptionalからAnyHashableへのキャストが直感的な挙動になったけど、結局これが暗黙に変わるのは流石にマズいので5.3以前の挙動に戻りました https://github.com/apple/swift/pull/35650 (edited)
As part of making casting more consistent, the behavior of Optional -&gt; AnyHashable casts was changed in some cases. This PR provides a hook for re-enabling the old behavior in certain conte...
いや、どっちもおかしいのか。本当はどっちもtrueになってほしいや。
Avatar
omochimetaru 03-Feb-21 07:13 AM
なんだこれw
どっちのバージョンも
"foo".some("foo")
AnyHashable としてみると違う値なのか?
@swift-5.3.3
print(AnyHashable("foo") == AnyHashable(Optional<String>("foo")))
(edited)
Avatar
swift53 BOT 03-Feb-21 07:16 AM
false
(edited)
Avatar
omochimetaru 03-Feb-21 07:16 AM
@swift-5.4.3
print(AnyHashable("foo") == AnyHashable(Optional<String>("foo")))
Avatar
swift54 BOT 03-Feb-21 07:16 AM
false
Avatar
omochimetaru 03-Feb-21 07:17 AM
違う値であるという挙動は同じで、辞書のキーになるときの挙動が違うのか?
Avatar
kateinoigakukun 03-Feb-21 07:17 AM
いや、String?からAnyHashableへの動的なキャストのタイミングで外側のオプショナルが外れるかどうかでAnyHashableの中に詰められる型が変わるんだと思います
Avatar
omochimetaru 03-Feb-21 07:18 AM
あーつまりこういうことか
@swift-5.3.3 @swift-5.4.3
let str = "foo" let ostr: String? = str let hstr: AnyHashable = ostr as AnyHashable print(hstr == AnyHashable(str)) print(hstr == AnyHashable(ostr))
(edited)
Avatar
swift54 BOT 03-Feb-21 07:19 AM
false true
(edited)
Avatar
swift53 BOT 03-Feb-21 07:19 AM
false true
(edited)
Avatar
omochimetaru 03-Feb-21 07:19 AM
違った・・・
Avatar
kateinoigakukun 03-Feb-21 07:20 AM
それだと静的なcoerceになるんじゃないですかね
Avatar
omochimetaru 03-Feb-21 07:21 AM
@swift-5.3.3 @swift-5.4.3
let str = "foo" let ostr: String? = str let tempAny: Any = ostr let hstr: AnyHashable = tempAny as! AnyHashable print(hstr == AnyHashable(str)) print(hstr == AnyHashable(ostr))
Avatar
swift54 BOT 03-Feb-21 07:21 AM
false true
stderr:
<stdin>:3:20: warning: expression implicitly coerced from 'String?' to 'Any' let tempAny: Any = ostr ^~~~ <stdin>:3:20: note: provide a default value to avoid this warning let tempAny: Any = ostr ^~~~ ?? <#default value#> <stdin>:3:20: note: force-unwrap the value to avoid this warning let tempAny: Any = ostr ^~~~ ! <stdin>:3:20: note: explicitly cast to 'Any' with 'as Any' to silence this warning let tempAny: Any = ostr ^~~~ as Any
Avatar
swift53 BOT 03-Feb-21 07:21 AM
true false
stderr:
<stdin>:3:20: warning: expression implicitly coerced from 'String?' to 'Any' let tempAny: Any = ostr ^~~~ <stdin>:3:20: note: provide a default value to avoid this warning let tempAny: Any = ostr ^~~~ ?? <#default value#> <stdin>:3:20: note: force-unwrap the value to avoid this warning let tempAny: Any = ostr ^~~~ ! <stdin>:3:20: note: explicitly cast to 'Any' with 'as Any' to silence this warning let tempAny: Any = ostr ^~~~ as Any
Avatar
omochimetaru 03-Feb-21 07:22 AM
お。できた。
Avatar
kateinoigakukun 03-Feb-21 07:22 AM
おー
Avatar
omochimetaru 03-Feb-21 07:23 AM
5.4だと動的なキャストだとAnyHashableにStringとして入っていくと
静的なコードと挙動が違うのもバグっぽいしrevertで良さそう
Avatar
kateinoigakukun 03-Feb-21 07:24 AM
dynamic castもう複雑すぎてわけわからん…
Avatar
omochimetaru 03-Feb-21 07:25 AM
んーなんか
他の言語だとそこまでややこしいことになってない印象があるんだけどな。
Avatar
tarunon 03-Feb-21 07:26 AM
悪いところ大体Optionalが挟まってる印象はある
Avatar
omochimetaru 03-Feb-21 07:27 AM
Optionalへの暗黙変換がある事と
しかし、TとT?が異なるものとして扱う場合と
混在してるせいでややこしいことになっている気がするね
Avatar
tarunon 03-Feb-21 07:29 AM
根本はT is-a T?かつT?をtagged unionにした設計が誤りでしたねに尽きるんだが
Avatar
omochimetaru 03-Feb-21 07:29 AM
T?? における .some(.none).none の区別とかもあるしなあ
Avatar
tarunon 03-Feb-21 07:30 AM
それのせいで、T?をAnyにキャストする時にT?として型情報を保持したままなのか、暗黙的にアンラップするのかが重なった状態になっていて(文脈によって正しい方が違う)
それのせいで破綻している
これがuntagged unionならアンラップしてからが正解で、is-aが存在しなければ型情報を保持するが正解 (edited)
Avatar
omochimetaru 03-Feb-21 07:36 AM
@swift-5.3.3 @swift-5.4.3
func toAny<X>(_ x: X) -> Any { x as Any } let s = "foo" let os = Optional(s) let a1 = toAny(s) as! AnyHashable let a2 = toAny(os) as! AnyHashable print(a1 == a2)
(edited)
Avatar
swift53 BOT 03-Feb-21 07:36 AM
true
(edited)
Avatar
swift54 BOT 03-Feb-21 07:37 AM
false
Avatar
omochimetaru 03-Feb-21 07:39 AM
5.3までの挙動は、動的な型に入れた時点では保持しているけど、比較するときに内部でis-aを考慮してるのかな。
@swift-5.3.3 @swift-5.4.3
func toAny<X>(_ x: X) -> Any { x as Any } let s = "foo" let os = Optional(s) let a1 = toAny(s) as! AnyHashable let a2 = toAny(os) as! AnyHashable print(a1.hashValue, a2.hashValue, a1 == a2)
(edited)
Avatar
swift53 BOT 03-Feb-21 07:40 AM
4198645417467545150 4198645417467545150 true
(edited)
Avatar
omochimetaru 03-Feb-21 07:40 AM
いや、同じものなのか・・・?
Avatar
kateinoigakukun 03-Feb-21 07:40 AM
というかhashValue自体が型を考慮してるはず
あれ、それおなじになるのか
Avatar
omochimetaru 03-Feb-21 07:40 AM
hashValue同じになったんだよなあ
Avatar
kateinoigakukun 03-Feb-21 07:40 AM
@swift-5.3.3
let a = Optional.some(1) let b = 1 print(a.hashValue) print(b.hashValue)
Avatar
swift53 BOT 03-Feb-21 07:40 AM
5998755465171700993 3246083455761462081
Avatar
swift54 BOT 03-Feb-21 07:40 AM
4555010388509318116 7560537639487603476 false
Avatar
omochimetaru 03-Feb-21 07:41 AM
5.4だと型を維持しているな
Avatar
tarunon 03-Feb-21 07:41 AM
@swift-5.3.3 @swift-5.4.3
let s = "s" let os=Optional(s) print(type(of: s), type(of: os), type(of: s as Any), type(of: os as Any))
(edited)
Avatar
swift53 BOT 03-Feb-21 07:41 AM
String Optional<String> String Optional<String>
(edited)
Avatar
swift54 BOT 03-Feb-21 07:41 AM
String Optional<String> String Optional<String>
(edited)
Avatar
tarunon 03-Feb-21 07:41 AM
5.3.3で消えてたのはAnyHashableの実装の中だね (edited)
Avatar
omochimetaru 03-Feb-21 07:42 AM
そうか、typeofってそういう中身の型が出るんだっけか
Avatar
tarunon 03-Feb-21 07:43 AM
AnyHashableの実装が、値しか見ない実装になってるなら5.3.3だし、型情報も焼き込むなら、5.4devになると思う
Avatar
omochimetaru 03-Feb-21 07:43 AM
@swift-5.3.3 @swift-5.4.3
let s = "s" let os = Optional(s) print(type(of: s), type(of: os), type(of: s as AnyHashable), type(of: os as AnyHashable))
(edited)
Avatar
swift53 BOT 03-Feb-21 07:43 AM
String Optional<String> AnyHashable AnyHashable
(edited)
Avatar
swift54 BOT 03-Feb-21 07:43 AM
String Optional<String> AnyHashable AnyHashable
(edited)
Avatar
tarunon 03-Feb-21 07:43 AM
ヒェッ
AnyHashableへのas、値が変わるのかw
Avatar
omochimetaru 03-Feb-21 07:44 AM
静的なキャストじゃだめだな・・・
@swift-5.3.3 @swift-5.4.3
func toAH<X>(_ x: X) -> AnyHashable { x as! AnyHashable } let s = "foo" let os = Optional(s) print(type(of: toAH(s)), type(of: toAH(os)), type(of: toAH(s) as Any), type(of: toAH(os) as Any))
(edited)
Avatar
swift53 BOT 03-Feb-21 07:44 AM
AnyHashable AnyHashable AnyHashable AnyHashable
(edited)
Avatar
tarunon 03-Feb-21 07:44 AM
@swift-5.3.3
print("s" as AnyHashable as? String)
Avatar
swift53 BOT 03-Feb-21 07:44 AM
Optional("s")
stderr:
<stdin>:1:7: warning: expression implicitly coerced from 'String?' to 'Any' print("s" as AnyHashable as? String) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <stdin>:1:26: note: provide a default value to avoid this warning print("s" as AnyHashable as? String) ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ ?? <#default value#> <stdin>:1:26: note: force-unwrap the value to avoid this warning print("s" as AnyHashable as? String) ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ ! <stdin>:1:26: note: explicitly cast to 'Any' with 'as Any' to silence this warning print("s" as AnyHashable as? String) ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ as Any
Avatar
tarunon 03-Feb-21 07:44 AM
なるほどなー
@frozen struct AnyHashable
まあそもそも値だったからそうか
Avatar
swift54 BOT 03-Feb-21 07:45 AM
AnyHashable AnyHashable AnyHashable AnyHashable
Avatar
omochimetaru 03-Feb-21 07:46 AM
typeofで中身が出るのはAnyとT特有か
Avatar
kateinoigakukun 03-Feb-21 07:46 AM
AnyというかExistentialというか
Avatar
tarunon 03-Feb-21 07:47 AM
Existentialだからですね
Avatar
omochimetaru 03-Feb-21 07:49 AM
@swift-5.3.3 @swift-5.4.3
func toAH<X>(_ x: X) -> AnyHashable { x as! AnyHashable } let s = "foo" let os = Optional(s) let a1 = toAH(s) let a2 = toAH(os) print(a1 == a2, a1.hashValue, a2.hashValue)
Avatar
swift54 BOT 03-Feb-21 07:49 AM
false 7411312793998186712 -1838519281677881482
Avatar
swift53 BOT 03-Feb-21 07:49 AM
true -7218179261913021143 -7218179261913021143
Avatar
omochimetaru 03-Feb-21 07:50 AM
5.4は String? を動的に AnyHashable にするときに String? を包んだものとしてキャストしていて
5.3は アンラップして String をキャストしたものになる
Avatar
kateinoigakukun 03-Feb-21 07:51 AM
うむ
Avatar
omochimetaru 03-Feb-21 07:51 AM
5.3でおかしいのは
辞書のキーとして比較するときに
その挙動が生じていないことかな?
@swift-5.3.3
func toAH<X>(_ x: X) -> AnyHashable { x as! AnyHashable } let s = "foo" let os = Optional(s) let a1 = toAH(s) let a2 = toAH(os) let d1: [AnyHashable: Int] = [s: 1] let d2: [AnyHashable: Int] = [a1: 1] print(d1[s] ?? 99, d1[os] ?? 99, d1[a1] ?? 99, d1[a2] ?? 99) print(d2[s] ?? 99, d2[os] ?? 99, d2[a1] ?? 99, d2[a2] ?? 99)
(edited)
Avatar
swift53 BOT 03-Feb-21 07:54 AM
1 99 1 1 1 99 1 1
(edited)
Avatar
omochimetaru 03-Feb-21 07:57 AM
これはバグだろう!
あ、 d1[os] のときにやってるのは静的な方か?
Avatar
kateinoigakukun 03-Feb-21 07:58 AM
5.3でおかしいのはOptional<T>とT where T: HashableをAnyHashableで静的にキャストするときにOptionalのunwrapが行われないことだと思います
そうそう
As part of making casting more consistent, the behavior of Optional -&gt; AnyHashable casts was changed in some cases. This PR provides a hook for re-enabling the old behavior in certain conte...
Avatar
omochimetaru 03-Feb-21 07:59 AM
静的な T? as AnyHashable のとき、アンラップしなかった方のAH が生成されるんだね
Avatar
kateinoigakukun 03-Feb-21 08:02 AM
静的なキャストか動的なキャストになるかは見分けるのが凄く難しい…
Avatar
omochimetaru 03-Feb-21 08:02 AM
それで挙動違うのだめだよなあ
Avatar
kateinoigakukun 03-Feb-21 08:03 AM
こういうのがあると最適化で動的なキャストを静的にするとかがやりにくくなりそう
例えばスペシャライズされてジェネリック型変数Tが具体型に固定された場合とか
Avatar
omochimetaru 03-Feb-21 08:05 AM
スペシャライズするかどうかで結果が変わるコード作れそうな気が
動的キャストのコード生成が先だから大丈夫なのかも?
スペシャライズされた結果、静的な型を動的キャストに渡すコードが残る・・・
Avatar
norio_nomura 08-Feb-21 05:24 AM
macOS Big Sur 11.2 & Xcode 12.4環境で、macOS版OSS ToolchainのSwift REPLを起動出来ない。エラーメッセージ的にはこれ https://bugs.swift.org/browse/SR-14098 手元ではswift-5.0.3-RELEASEは起動できるけど、それ以降の5.1.5, 5.2.5, 5.3.3リリースおよび5.4, mainスナップショット全部起動出来ない。
Avatar
omochimetaru 12-Feb-21 02:25 AM
Hi everyone, Swift is applying to participate in Google Summer of Code this year again. We had some great projects last year (4 out of 4 completed successfully), and this year we wanted to give the community a little bit of a heads up, so you can also come up with your own ideas in case you have some you would like to propose and find a mentor...
GSoC 2021のアナウンスだ
We had some great projects last year (4 out of 4 completed successfully),
マージされていない家庭くんの成果も成功したことになっている
🙃 1
😂 3
Scripting in Swift
おおお、テーマ候補に良いのがある
(edited)
Increase differentiable programming’s language coverage
微分のやつもある。最近話題がなかったけど息してた
Avatar
rintaro 12-Feb-21 02:30 AM
今回から 18 hours a week のコミットメントなので、日本の学生も参加しやすくなっていると思います。
(前回までは 30 hours a week)
Avatar
omochimetaru 12-Feb-21 02:31 AM
ああ〜 家庭くんめっちゃ忙しそうだったやつ
Avatar
Kishikawa Katsumi 12-Feb-21 12:53 PM
XcodeのSwitch文でCaseを生成してくれるやつ、caseのbodyのところ、<#code#>じゃなくてbreakを入れてくれた方がリズムよく書ける気がする。
switch rpcMessageType { case .playAnimation: <#code#> case .completeTask: <#code#> case .syncSettings: <#code#> case .setInfected: <#code#> ...
今はこんな感じに生成されるけど、<#code#> のところbreakがいい、気がする。
Avatar
omochimetaru 12-Feb-21 12:56 PM
あーなんかそれがあるとTAB押したときに次の code に行っちゃうのが不便なときはある
まだ .playAnimation: の本文を書いてるからインデントしたいのに .completeTAskのプレースホルダに行ってしまう・・・という挙動だった気がする?
Avatar
Kishikawa Katsumi 12-Feb-21 12:59 PM
引数とかの部分はキレイに展開してくれたりするからプレースホルダはすごく便利だけど、こういうただ消すだけのプレースホルダはあまり嬉しくない。。。とりあえずコンパイルが通るコードが生成されてほしい。。。
Avatar
koher 20-Feb-21 06:19 PM
これ↓めっちゃ便利じゃないですか?
infix operator ..<?: RangeFormationPrecedence func ..<?<T>(lhs: T, rhs: T) -> Range<T>? where T: Comparable { guard lhs <= rhs else { return nil } return lhs ..< rhs } infix operator ...?: RangeFormationPrecedence func ...?<T>(lhs: T, rhs: T) -> ClosedRange<T>? where T: Comparable { guard lhs <= rhs else { return nil } return lhs ... rhs }
👀 1
Avatar
rintaro 25-Feb-21 05:29 AM
https://forums.swift.org/t/swift-panel-at-the-community-o-summit/45041 LLVM財団のオンラインイベントです。LLVM Developers Meeting よりはもっと軽い感じだと思います。Swiftの開発者も参加するので、興味があったら是非参加してみてください。
Hi Everyone, We're happy to announce the Community.o Summit, which is held virtually March 8-10, 2021 by the LLVM Foundation. This 3-day virtual event is an inclusive space for underrepresented groups and newcomers, anywhere in their career, interested in learning and contributing to compilers, tools, and programming languages. We’ll highlight ...
👀 1
Avatar
freddi 25-Feb-21 05:37 AM
今年のLLVM Developers Meeting 結局理解できたのkeynote だけだった。。。
Avatar
rintaro 25-Feb-21 05:45 AM
今回のイベントはコンパイラ技術云々とかより、開発コミュニティにフォーカスしていて、皆がどんな感じでコンパイラ開発の世界に入っていったのかとか、そのあたりの雰囲気がつかめるのかなと思います。
Avatar
freddi 25-Feb-21 07:56 AM
よさそう
Avatar
koher 12-Mar-21 02:58 AM
"zatsu" じゃないけど "1" も "2" も会話が続いてそうなのでここに。 Actors の Proposal が Evolution に追加されたようです! SE-0306: Actors https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 12-Mar-21 02:59 AM
いまピッチ6になってますね そろそろ来るのかな
Avatar
koher 12-Mar-21 03:00 AM
Evolutionに3時間前に追加されてて、SE-0306のナンバーも振られて、レビューの日程も入ってるので来るんじゃないでしょうか。
Avatar
omochimetaru 12-Mar-21 03:00 AM
Thanks Doug, I'm glad to see nonisolated(unsafe) get subsetted out of this round of the proposal. Much of my feedback from the 5th draft last night stands, including: Actor protocol should be named AnyActor for consistency with AnyClass and other type erased things in Swift. isolated self doesn't really work for the same reason we don't use...
ラトナーが、寝て起きて思ったんだけど、ってめっちゃ書き込んでたりする
Avatar
koher 12-Mar-21 03:01 AM
Joe_Groff 3h I have merged this pitch as proposal SE-0306 21, and scheduled it for review starting next Monday.
Avatar
omochimetaru 12-Mar-21 03:01 AM
お、予告だ
Avatar
koher 12-Mar-21 03:02 AM
Proposal の方にも
Status: Scheduled for Review (March 15...29, 2021)
って書かれてる。
Avatar
omochimetaru 12-Mar-21 06:23 AM
This is a full proposal for the Swift Forums pitch Allow interchangeable use of CGFloat and Double types
CGFloat暗黙変換も Scheduling for next Monday. されとる (edited)
Avatar
niw 12-Mar-21 06:23 AM
CGFloat が Double じゃない環境はもうどこにもないんだっけ
Avatar
omochimetaru 12-Mar-21 06:24 AM
armv7が動くAndroid環境があるって書き込みを見た
Pitch: Allow interchangeable use of CGFloat and Double types Implementation: PR [DNM][TypeChecker] Implement Double <-> CGFloat implicit conversion by xedin · Pull Request #34401 · apple/swift · GitHub based on the main branch. Toolchains are available for macOS and Linux. Motivation When Swift was first released, the type of CGFloat presented ...
Avatar
niw 12-Mar-21 06:26 AM
これを機会に Scala的な implicit が導入されると黒魔術が使えて嬉しい
Avatar
omochimetaru 12-Mar-21 06:26 AM
それはやばい・・・ この話はコンパイラの特別対応っぽいですね
Avatar
niw 12-Mar-21 06:27 AM
楽しいと思うんだけどなあ...
使うとcode reviewでめっちゃえーーーって言われるimplicit
Avatar
omochimetaru 12-Mar-21 06:27 AM
ww
でもまあSwiftにはextensionもあるし、protocolの型クラス的振る舞いもあるので
Scalaのimplicitの主要なユースケースはカバーできてませんか?
Avatar
niw 12-Mar-21 06:28 AM
できてると思う。
Avatar
omochimetaru 12-Mar-21 06:29 AM
もしちょっとぐらい微妙に残ってても、そこだけ言語機能を提供すれば良さそう
Avatar
niw 12-Mar-21 06:29 AM
Double を CGFloat にしたいなんて、それなんて JavaConverters っていう感じ
Avatar
omochimetaru 12-Mar-21 06:30 AM
なるほど
Avatar
omochimetaru 22-Mar-21 06:44 PM
Hello! My name is Tomoaki Kobayashi and I am an undergraduate student in Japan. I am interested in the project and started to read the related codes like TypeCheckConstraints, ConstraintSystem, and CSSolver a little bit. @hborla @xedin Do you have a typical example where a confusing type is inferred? If we also consider type errors in that c...
GSoCに日本人がエントリーしてる
👀 1
Avatar
koher 30-Mar-21 02:59 AM
suffix(while:) ってなんでないんですっけ?普通にほしい気が。
英語として suffix の場合 while のニュアンスが変?
Avatar
omochimetaru 30-Mar-21 03:03 AM
Swift Algorithms is an open-source package of sequence and collection algorithms, along with their related types. - apple/swift-algorithms
👀 1
ここにはあった
単に どこまで入れればいいかわからんからとりあえずなしで になっていたんじゃなかろうか
prefix while と suffix length がある以上、計算量的な問題とかで入れなかったわけではなさそう。
Avatar
koher 05-Apr-21 08:34 AM
@swift-5.3.3
let a: Int if Bool.random() { a = 2 } else { a = 3 } print(a)
Avatar
swift53 BOT 05-Apr-21 08:34 AM
3
Avatar
koher 05-Apr-21 08:35 AM
@swift-5.3.3
let a: Int? if Bool.random() { a = 2 } else { a = nil } print(a)
Avatar
swift53 BOT 05-Apr-21 08:35 AM
nil
stderr:
<stdin>:7:7: warning: expression implicitly coerced from 'Int?' to 'Any' print(a) ^ <stdin>:7:7: note: provide a default value to avoid this warning print(a) ^ ?? <#default value#> <stdin>:7:7: note: force-unwrap the value to avoid this warning print(a) ^ ! <stdin>:7:7: note: explicitly cast to 'Any' with 'as Any' to silence this warning print(a) ^ as Any
Avatar
koher 05-Apr-21 08:35 AM
Optional って遅延初期化できないの?
Avatar
omochimetaru 05-Apr-21 08:35 AM
できてませんか?
Avatar
tarunon 05-Apr-21 08:35 AM
できてません?これはprintにoptional渡したときの警告 (edited)
Avatar
koher 05-Apr-21 08:36 AM
あれ?警告か。
なんで手元ではエラーになってるんだ・・・。
あ、ミスってた。手元のより複雑なコードでは if let でシャドーイングされてた・・・。すみません。
Avatar omochimetaru
prefix while と suffix length がある以上、計算量的な問題とかで入れなかったわけではなさそう。
Avatar
niw 05-Apr-21 05:52 PM
suffixまわりが弱い理由ってそうじゃないんだ... (edited)
なんか対称性が崩れててきもいって思ってた&いろいろ実装でめんどうだった
Avatar
masakihori 06-Apr-21 07:04 AM
BidirectionalCollection は逆順に数え上げられるCollectionなのでここに生やせば問題ないです
Avatar masakihori
BidirectionalCollection は逆順に数え上げられるCollectionなのでここに生やせば問題ないです
Avatar
omochimetaru 06-Apr-21 07:07 AM
そもそもSequenceにsuffixがあるんですよ https://developer.apple.com/documentation/swift/sequence/3128822-suffix
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
普通に全要素吸い出してる
Avatar
masakihori 06-Apr-21 07:46 AM
まじか! 無限に長いSequenceに注意が必要
じゃなくて、無限に長くなくても計算量がヒドイ
Avatar
omochimetaru 06-Apr-21 07:48 AM
Complexity: O(n), where n is the length of the sequence.
O(n)明示されてますね。
Avatar
koher 06-Apr-21 09:31 AM
なんか基準が謎だなぁ。 O(n) 許すなら Sequence に subscript(index: Int) が生えててもいい気も。さすがに subscript は勘違いしそうかもしれないけど。
Avatar
tarunon 06-Apr-21 09:32 AM
変数(subscriptおよびcomputed propertyを含む)はO(1)必須で、関数はO(n)でもオッケーという基準だと思う (edited)
Avatar
koher 06-Apr-21 09:37 AM
それだとプロパティの firstSequence に生えてても良さそう?
Avatar
omochimetaru 06-Apr-21 09:52 AM
Sequenceってfirst whereしかなかったのか・・・
first whereのwhereが { true } の場合と等価だから
そもそもあって良さそうですね。
Avatar
tarunon 06-Apr-21 09:54 AM
first(where:) は一応最悪O(N)では (edited)
Avatar
koher 06-Apr-21 09:59 AM
extension Sequence { var first: Element? { var iterator = makeIterator() return iterator.next() } }
↑で O(1)
Avatar
koher 09-Apr-21 04:51 AM
@swift-5.3.3
let a: [Int] = [2, 3, 5] let i: [Int].Iterator = a.makeIterator()
Avatar
swift53 BOT 09-Apr-21 04:51 AM
exit status: 1 with stderr:
<stdin>:2:13: error: consecutive statements on a line must be separated by ';' let i: [Int].Iterator = a.makeIterator() ^ ; <stdin>:2:14: error: member 'Iterator' in 'IndexingIterator<[Int]>' produces result of type 'IndexingIterator<[Int]>.Iterator.Type' (aka 'IndexingIterator<Array<Int>>.Type'), but context expects 'IndexingIterator<[Int]>' let i: [Int].Iterator = a.makeIterator() ^
Avatar
koher 09-Apr-21 04:51 AM
@swift-5.3.3
let a: [Int] = [2, 3, 5] let i: Array<Int>.Iterator = a.makeIterator()
Avatar
swift53 BOT 09-Apr-21 04:51 AM
no output
Avatar
koher 09-Apr-21 04:51 AM
そういうものなんですっけ?
Avatar
rintaro 09-Apr-21 04:54 AM
いちおうそういう物なんですよね。. でつなぐメンバータイプは文法上 type identifier のみに設定されているのです。
@swift-5.3.3
let a = [Int].Element() print(a)
ただこれは動いちゃうのです。なぜならこれは文法上 type じゃなくて expression としてパースされるから。
Avatar
swift53 BOT 09-Apr-21 04:56 AM
0
Avatar
rintaro 09-Apr-21 04:57 AM
仕様バグといえばその通り。
Avatar
koher 09-Apr-21 05:10 AM
type には array-type が含まれてるけど、 type-name には array-type は含まれないってことですね。 https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type
👍 1
Avatar
Kishikawa Katsumi 10-Apr-21 05:26 PM
SwiftFiddle is an online playground for creating, sharing and embedding Swift fiddles (little Swift programs that run directly in your browser).
5.3以上の環境でいくつかライブラリを利用できるようにしてみた。
🙌 5
Avatar
yutailang0119 11-Apr-21 08:57 AM
すごい、遊びやすい
Avatar
Kishikawa Katsumi 11-Apr-21 10:43 AM
これが入ってたら良い、、、っていうの教えてくれたら入れられそうなもの(SPMですっとビルドできる、Linuxで動く、など)はとりあえず入れます。
Avatar
lovee 12-Apr-21 02:37 PM
OrderedDictionaryいいね
💃 1
Avatar
tarunon 18-Apr-21 05:28 AM
Optionalの記事書きつつちょいとサーベイしてたら見つけてしまったw @swift-5.3.3
let s: String? = .none let t: String?? = s let u: String?? = .none let x = (s as AnyHashable).hashValue let y = (t as AnyHashable).hashValue let z = (u as AnyHashable).hashValue print(s == t, x == y) print(s == u, x == z)
Avatar
swift53 BOT 18-Apr-21 05:28 AM
true false false true
Avatar
tarunon 18-Apr-21 05:28 AM
ほんまめちゃくちゃやで
Avatar
koher 18-Apr-21 02:25 PM
これはひどいww
Avatar
Avatar
t.ae 19-Apr-21 12:08 AM
これって間違ってるんですかね? ハッシュはa == b -> a.hashValue == b.hashValueのはずですが、 ここでは型が一致していないので、xy,zを並べて良いものか怪しい気がします。s == ts==uは暗黙的にOptional`に包まれるのもありますし。
Avatar
t.ae 19-Apr-21 12:15 AM
THashable, ∀a,bT, a == b -> a.hashValue == b.hashValue 定義がこんな感じだとすると、String?String??で型が一致していない場合は前提が崩れるのでhashValueについては何も言えないはずです。
Avatar
tarunon 19-Apr-21 01:11 AM
上の方で話題になった https://discord.com/channels/291054398077927425/375206337937801216/806409093417533462 に関連して何ですけど、Optionalのラップでハッシュ値がズレるのは良いと思うんですよ
どっちかと言えば.noneが型に関わらず同じハッシュ値を示すのが気持ち悪いな、と言うところです
Avatar
t.ae 19-Apr-21 01:19 AM
定義的には反してないので実装次第ですね。
@swift-5.3.3
var s1 = "Foo" var s2 = Optional("Foo") print(s1.hashValue, s2.hashValue) print((s1 as AnyHashable).hashValue, (s2 as AnyHashable).hashValue) print((s1 as! AnyHashable).hashValue, (s2 as! AnyHashable).hashValue)
Avatar
swift53 BOT 19-Apr-21 01:19 AM
-4610515456940335649 5550570105904624955 -4610515456940335649 5550570105904624955 -4610515456940335649 -4610515456940335649
stderr:
<stdin>:5:11: warning: forced cast from 'String' to 'AnyHashable' always succeeds; did you mean to use 'as'? print((s1 as! AnyHashable).hashValue, (s2 as! AnyHashable).hashValue) ^~~ as <stdin>:5:43: warning: forced cast from 'String?' to 'AnyHashable' always succeeds; did you mean to use 'as'? print((s1 as! AnyHashable).hashValue, (s2 as! AnyHashable).hashValue) ^~~ as
Avatar
t.ae 19-Apr-21 01:20 AM
asas! で変わるのか🤔
Avatar
Iceman 19-Apr-21 01:40 AM
親切なwarning出てるけど挙動違うから罠だ
Avatar
koher 19-Apr-21 02:14 AM
何が悪いって暗黙の型変換が悪くて、暗黙の型変換をサブタイピングのように振る舞わせてるからこういうところに歪みが出てくる。
Avatar
tarunon 19-Apr-21 01:33 PM
記事書きつつここの議論を踏まえた上で、私の中に 1. 暗黙の型変換(auto boxingもしくはそれ相当)をサブタイピングとして扱うことはやるべきではない(あくまで型変換に留まらせるべきである) 2. もし暗黙の型変換をサブタイピングとして扱うことを許容したとしても、逆向きの暗黙のアンラップは許容するべきではない と言う仮設が構築されつつある
おそらくですが、swiftのサブタイピングにおいてTとT?が特にヤバくて、T?とU?は許容できる可能性がありそう(ちゃんと考えてない)
Avatar
niw 27-Apr-21 04:11 AM
3,000個のプロパティがあると遅くなるらしい
Avatar
Kishikawa Katsumi 27-Apr-21 04:12 AM
自動生成したモデルとかでぶつかったりしそう
Avatar
niw 27-Apr-21 04:13 AM
自動生成でも3,000もひとつのクラスに状態があるのやばそう (edited)
Avatar
Kishikawa Katsumi 27-Apr-21 04:14 AM
そうですねえ。コンパイルエラーでもいい気はするけどそういう分野のプログラミングもきっとありそう。
バグレポートが出てるということはそういうことなんだろうな。
Avatar
niw 27-Apr-21 04:15 AM
Compiling one of our generated classes takes nearly 10x longer with Swift 5.4 than the last few releases - and this class already took a minute or two to compile 😬 pretty big regression https://t.co/5wVllUx1W8
Square...
ひょっとすると AppState みたいなクラスがあって、アプリケーションの状態を全部もってるのかも。
Avatar
Kishikawa Katsumi 27-Apr-21 04:16 AM
ありそう。
Avatar
niw 27-Apr-21 04:16 AM
あるいは、UIの自動テストとかでそういうクラスつくってるのかなあ。
Avatar
Kishikawa Katsumi 27-Apr-21 04:17 AM
Reduxで、でかいStructが問題になることはなんか結構前にみました。リリースビルドでしか動かない、だったかな。
Avatar
niw 27-Apr-21 04:17 AM
www
ありそう
Avatar
omochimetaru 27-Apr-21 04:17 AM
スタックが吹っ飛びそう
Avatar
niw 27-Apr-21 04:18 AM
なんというか ractive系のそれはいろいろ見るたびにめっちゃ富豪...って思う昨今
Avatar
omochimetaru 27-Apr-21 04:19 AM
コンパイラ実装の中にうっかりプロパティ数に対して O(n^2) な部分が隠れてるとか
そういう原因な気がする
Avatar
niw 27-Apr-21 04:20 AM
そんな感じでしょうね...
Avatar
niw 27-Apr-21 04:51 PM
@simjp It’s a file of generated constants for our design system. The constants are shared across iOS, web and android, and there’s constants for styling every aspect of many different components, so it adds up.
意外すぎる理由
Avatar
omochimetaru 27-Apr-21 05:09 PM
グループごととかに型切ってわけられそう
Avatar
Kishikawa Katsumi 18-May-21 12:31 AM
Swift Systemが謎のタグ名のルール変更してる。v付きだとSwift Package Managerに怒られるんだけどな。 (edited)
Avatar
tarunon 18-May-21 01:06 AM
issue立てても良いのでは
Avatar tarunon
issue立てても良いのでは
Avatar
Kishikawa Katsumi 18-May-21 01:45 AM
そうかも。ちょっと触ってみて問題ありそうだったらやってみます。 Renovateがこのタグで自動的にVer UpのPRを出してそれで"v0.0.2"が正しくない、って出てたんですよね。
0.0.2と書けばいけるしXcodeは自動的にvを省いてくれるっぽいな。 Renovateが壊れるだけだけどそのことを一応報告しておくことにします。
Avatar
Kishikawa Katsumi 18-May-21 02:16 AM
The tag for version 0.0.2 now has a prefix of v, unlike the previous tag, which is now v0.0.2. This will affect automatic updates of Renovate (https://github.com/apps/renovate). Renovate will autom...
👍 2
Avatar
Kishikawa Katsumi 18-May-21 03:20 AM
直してくれた☺️(新しく0.0.2のタグがついた)
👍 5
Avatar
niw 18-May-21 04:02 AM
vつきは消さないのかな…
Avatar
yutailang0119 18-May-21 04:04 AM
prefix、renovateで困ってる https://github.com/renovatebot/renovate/issues/9077
What Renovate type, platform and version are you using? Renovate for GitHub Describe the bug If tags rule of the target repository has a prefix, Renovate will insert it as a version. In this case, ...
Avatar
Kishikawa Katsumi 18-May-21 04:04 AM
互換性の問題があるんじゃないですか。いや、vはXcodeとかが勝手に削除するから実はないのか。。。?
Avatar
niw 18-May-21 04:07 AM
GitHubがおすすめしてきたからつけちゃったてきな…
vつける作法のパッケージもあるからなあ
人類にsemverタグはまだ早かった
Avatar
Kishikawa Katsumi 18-May-21 04:09 AM
まあv付けると検索のところでとりあえずvって入れるとタグだけになる、からちょっと便利、と思っています。メリットはそれくらい。
Avatar
niw 18-May-21 04:10 AM
数字だけだと不安になる気持ちもわかる
Avatar yutailang0119
prefix、renovateで困ってる https://github.com/renovatebot/renovate/issues/9077
Avatar
Kishikawa Katsumi 18-May-21 04:15 AM
同じ問題の人がいてよかった。Renovateの方で吸収してくれるのが一番丸く収まりそう。
Avatar Kishikawa Katsumi
同じ問題の人がいてよかった。Renovateの方で吸収してくれるのが一番丸く収まりそう。
Avatar
yutailang0119 18-May-21 04:17 AM
renovateのコード読んで、なんとなくはわかったけど、自信ないからコアチーム頼む!って気持ちでした!
世間だと困ってる人少なくて、本当に?って思ってる
Avatar
Kishikawa Katsumi 18-May-21 04:19 AM
Renovateをもっと布教していかなかければ。 ただまあ別に解説が必要だったりは全然ないんですよね。ボタンポチッと押してリポジトリ選ぶだけ。。。
Avatar
d_date 18-May-21 07:10 PM
A new tool that blends your everyday work apps into one. It's the all-in-one workspace for you and your team
Avatar
Kishikawa Katsumi 18-May-21 07:25 PM
この辺りもう少し厳密な表現がありそう。
ModuleはAppバンドル(実行形式)やFramework、Libraryを含む、で
概念としてはこういう包含関係で、
ModuleならばImportできる、はきっと正しい
Avatar
niw 18-May-21 07:29 PM
内容以外では、swiftと、Swift、コンパイルとLinkとか、表記の揺れが気になった
🙏 1
Avatar
Kishikawa Katsumi 18-May-21 07:30 PM
「アプリに追加するためには」は要するに「Linkできる」が厳密だと思うので
こう。
StaticかDynamicという分類はたぶん自明だからいいとして、LibraryかFrameworkか、というのは少なくともApple Platformでは
Bundleの有無という切り口がある
めっちゃ機械的に整理するとこうかなあ。見落としとかはありそう。
すごく広義の意味のコンパイラの生成物の単位をモジュールと呼んでいて、モジュールにはAppバンドルやフレームワークバンドル、ライブラリなどがある。
Avatar
Kishikawa Katsumi 18-May-21 07:43 PM
上で書いたLinkできるというのもだいぶいい加減だな。 実行形式のモジュールにリンクできるモジュール、でいいのか?
Avatar
kateinoigakukun 19-May-21 12:20 AM
Swiftモジュールとバンドル形式(.framework、.bundle)とライブラリの動的静的はそれぞれ直交する概念じゃないですか? (edited)
Avatar
kateinoigakukun 19-May-21 12:34 AM
SwiftモジュールはSwiftの言語上の概念で、大雑把にimportできるインターフェイスの単位と言ってあっていると思います。ただ、モジュール自体はリンクの方法やパッケージング方式には関与しません。 ライブラリ(.a, .dylib)はリンカによってリンクされる単位で、Swiftの文化では基本的にモジュールと1対1に対応していますが、絶対にそうでないといけないというわけでもないです。 バンドル形式(.app, .bundle, .framework)はAppleプラットフォームで使える取り回しのしやすいリソースのパッケージング形式で、プログラム(ライブラリや実行形式)とヘッダファイル(.hやSwiftのモジュールファイル)とリソースをまとめるモノという理解です。 https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html
Explains how to use bundle objects to organize resources.
3. それぞれの.oを一つにまとめてそのモジュールの .o (Object Code) を生成する(これをLinkという)
おそらく、これは.oをarでまとめて.aを生成するアーカイブだとおもいます(多分…) 手元で試してみたんですが、生成されているのはちゃんと再配置可能なオブジェクトファイルでした。🙇 アーカイブにすると使われないシンボルがリンクされなくて困るからなのかな?ライブラリを使う側でオブジェクトファイルを列挙すればいい気がするけど…(SwiftPMはそうなってる)
(edited)
Avatar
d_date 19-May-21 03:19 AM
起きたらコメントがついててうれしい ビルドのログみながら挙動を見つめたせいで概念的なところの理解が怪しいので整理いただいてありがたいです🙇 FrameworkとLibraryの関係がまだいまいちわかってないかも。 Frameworkの中にar archiveがアーキテクチャごとに入っているので、Apple platformで使いやすくしたというのはなんとなくそうなのかもと思った
Avatar kateinoigakukun
Swiftモジュールとバンドル形式(.framework、.bundle)とライブラリの動的静的はそれぞれ直交する概念じゃないですか? (edited)
Avatar
Kishikawa Katsumi 19-May-21 03:21 AM
それぞれ直交する概念
そう思います。 で、で、ModuleとFrameworkの違い、って問いの答えとして、 FrameworkはModuleの1つだけど、こういう特徴を持つものは(Apple Platformで)Frameworkという、ということでリンク可能とかバンドルを持つ、とかいくつかの視点よって分類される、というのが私の論点です。
Avatar Kishikawa Katsumi
それぞれ直交する概念
そう思います。 で、で、ModuleとFrameworkの違い、って問いの答えとして、 FrameworkはModuleの1つだけど、こういう特徴を持つものは(Apple Platformで)Frameworkという、ということでリンク可能とかバンドルを持つ、とかいくつかの視点よって分類される、というのが私の論点です。
Avatar
kateinoigakukun 19-May-21 04:17 AM
FrameworkはModuleの1つだけど
FrameworkはModuleを内部に持つ、ですかね?僕の言うModuleは.swiftmoduleかmodule.mapなんですが認識一致してますか?
いくつかの視点よって分類される
これには同意できます👍
(edited)
Avatar
Kishikawa Katsumi 19-May-21 04:21 AM
FrameworkはModuleを内部に持つ、ですかね?僕の言うModuleは.swiftmoduleなんですが認識一致してますか?
あってます。確かに「FrameworkはModuleを内部に持つ」の方が厳密ですね。 ただ「Moduleは.swiftmodule」なんですけどモジュールとフレームワークの違い、という問いに具体例を挙げていくなら とりあえずモジュールとフレームワークが1対1で対応する場合、みたいな前提を一旦おいた方がわかりやすい、と思います。
で、それを理解していると、複数のモジュールから1つのフレームワークが構成されることもある、 ライブラリのモジュールはライブラリのもつInterfaceの一部だけを公開していることもある、 みたいな説明も理解できると思います。 (edited)
いや、さっきの図で言うと最初からswiftmoduleかmodule.mapを出して説明した方がいいかなあ?
Avatar
kateinoigakukun 19-May-21 04:27 AM
なるほど。僕がモジュールとフレームワークの違いについて答えるとしたらこうなりますね↓ 「モジュールはライブラリから提供されるSwift APIを記したモノで、フレームワークはモジュールとライブラリとリソースアセットを一纏めにしたもの。ライブラリを配布するときは構成要素がバラバラだと使う側が大変なのでフレームワークとして提供することが多い。」
💯 2
Avatar
Kishikawa Katsumi 19-May-21 04:28 AM
^ これは端的で過不足ないカンペキな説明だと思います。
Avatar
niw 19-May-21 04:31 AM
もともとmoduleは#includeやばいってclangで作られたのだけど、swiftmoduleも同じかんじかな? (edited)
Avatar
kateinoigakukun 19-May-21 04:32 AM
ただ、万人にとって理解しやすいかと言われると自信がないので、岸川さんの一旦1対1対応を前提においた説明もありだと思います。 😅
Avatar niw
もともとmoduleは#includeやばいってclangで作られたのだけど、swiftmoduleも同じかんじかな? (edited)
Avatar
kateinoigakukun 19-May-21 04:32 AM
そうですね、module.mapとそれに付随するヘッダ郡がSwiftだとswiftmoduleに対応してます (edited)
Avatar kateinoigakukun
そうですね、module.mapとそれに付随するヘッダ郡がSwiftだとswiftmoduleに対応してます (edited)
Avatar
niw 19-May-21 04:35 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar kateinoigakukun
そうですね、module.mapとそれに付随するヘッダ郡がSwiftだとswiftmoduleに対応してます (edited)
Avatar
rintaro 19-May-21 04:36 AM
ややこしくして申し訳ないけど、現 Swift では module.modulemap + ヘッダ群にあたるのは .swiftinterface ですね。
Avatar rintaro
ややこしくして申し訳ないけど、現 Swift では module.modulemap + ヘッダ群にあたるのは .swiftinterface ですね。
Avatar
niw 19-May-21 04:36 AM
むむっ...
Avatar
rintaro 19-May-21 04:36 AM
.swiftmodule.swiftinteface のバイナリ表現(キャッシュ)で clang でいうところの .pcm (edited)
Avatar
kateinoigakukun 19-May-21 04:37 AM
あー、たしかに.swiftmoduleはprecompiled moduleですね。
Avatar
niw 19-May-21 04:37 AM
なるほど
Avatar
Kishikawa Katsumi 19-May-21 04:37 AM
swiftinterfaceはライブラリエボリューションを有効にしないと出ないんじゃないですか?
出るんでしたっけ?
Avatar
d_date 19-May-21 04:38 AM
手元では出てない
Avatar
rintaro 19-May-21 04:40 AM
.swiftinterface は後方互換性あるけど、 .swiftmodule は生成したコンパイラバージョンでしか読めない。で、配布しないモジュールは後方互換性を確保する必要が無いので、.swiftinterface を出す必要がないので出してないノだと思います。
で、framework に .swiftmodule を入れられて、それが import できる、つまり .swiftinterface の代わりに(コンパイラのバージョンが一致していれば) .swiftmodule を使うことができる状態になっている。
😯 1
🆒 1
👍 1
Avatar
rintaro 19-May-21 06:55 AM
.swiftinterface.swiftmodule のどっちが「正」かっていうのは議論あるかも。 https://forums.swift.org/t/explicit-module-builds-the-new-swift-driver-and-swiftpm/36990 ここでは "there are four forms of module"
Hi all, In the llbuild2 announcement, @ddunbar mentioned the goal of supporting "explicit modules" in the build system. I wanted to describe what explicit modules are, why they are important, and the developer work we're doing to bring the benefits of explicit module builds to SwiftPM. Modules in Swift Swift programs are composed of a number o...
Avatar
omochimetaru 19-May-21 06:56 AM
swiftinterfaceが正だと思うなあ
swiftmoduleは最適化されたバイナリ版なので。 デフォルトでどっちが吐かれるかという事はどっちが正かということとは関係ないし。
Avatar
kateinoigakukun 24-May-21 09:08 AM
@swift-5.3.3 @swift-5.4.3
protocol P {} struct S: P {} func check(_ maybeS: S?) { print("maybeS = \(maybeS)") print("maybeS is P = \(maybeS is P)") print("maybeS as Any is P = \(maybeS as Any is P)") print("------------------------------------------") } check(S()) check(nil)
Avatar
swift54 BOT 24-May-21 09:08 AM
maybeS = Optional(main.S()) maybeS is P = true maybeS as Any is P = true ------------------------------------------ maybeS = nil maybeS is P = false maybeS as Any is P = false ------------------------------------------
stderr:
<stdin>:6:23: warning: string interpolation produces a debug description for an optional value; did you mean to make this explicit? print("maybeS = \(maybeS)") ^~~~~~ <stdin>:6:23: note: use 'String(describing:)' to silence this warning print("maybeS = \(maybeS)") ^~~~~~ String(describing: ) <stdin>:6:23: note: provide a default value to avoid this warning print("maybeS = \(maybeS)") ^~~~~~ ?? <#default value#> <stdin>:7:35: warning: checking a value with optional type 'S?' against dynamic type 'P' succeeds whenever the value is non-nil; did you mean to use '!= nil'? print("maybeS is P = \(maybeS is P)") ~~~~~~ ^~~~ != nil
Avatar
swift53 BOT 24-May-21 09:08 AM
maybeS = Optional(main.S()) maybeS is P = true maybeS as Any is P = false ------------------------------------------ maybeS = nil maybeS is P = false maybeS as Any is P = false ------------------------------------------
stderr:
<stdin>:6:23: warning: string interpolation produces a debug description for an optional value; did you mean to make this explicit? print("maybeS = \(maybeS)") ^~~~~~ <stdin>:6:23: note: use 'String(describing:)' to silence this warning print("maybeS = \(maybeS)") ^~~~~~ String(describing: ) <stdin>:6:23: note: provide a default value to avoid this warning print("maybeS = \(maybeS)") ^~~~~~ ?? <#default value#> <stdin>:7:35: warning: checking a value with optional type 'S?' against dynamic type 'P' succeeds whenever the value is non-nil; did you mean to use '!= nil'? print("maybeS is P = \(maybeS is P)") ~~~~~~ ^~~~ != nil
Avatar
kateinoigakukun 24-May-21 09:11 AM
T is Pのとき、5.3だとT?をAnyに包むとPにキャストできなかったんですが、5.4の新しいキャストロジックではキャストできるようになってるんですよね (edited)
バグチケットはこれだ SR-1999 https://bugs.swift.org/browse/SR-1999
で、IBLinterに5.3の挙動に依存した実装があって、macOS11.3に同梱されてる5.4のランタイムだとバグる事故が発生しました。
キャストロジック難しすぎる
Avatar
omochimetaru 05-Jun-21 06:21 AM
うーん、Xcodeのテスト実行からだと Foundation.Process/usr/bin/swiftc を実行しようとすると、
2021-06-05 15:20:12.963749+0900 swiftc[99910:13408271] Failed to open macho file at /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links
Avatar
niw 07-Jun-21 02:03 AM
ループしてる?
Avatar
omochimetaru 07-Jun-21 02:14 AM
そう思ったんですけど、 /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc が -> swift-frontend にリンクしてるだけで終わりなんですよね。 (edited)
もしかしたら swiftc じゃなくて、そこから開こうとしてるdylibがループしているとかかもしれないんですが
調べ方がわからず。
Avatar
niw 07-Jun-21 02:15 AM
dyldのエラーなら環境変数いれればログ出せる
Avatar
omochimetaru 07-Jun-21 02:15 AM
man dyld 見たけど多すぎてよくわからなかった・・・
Avatar
niw 07-Jun-21 02:16 AM
PRINTなんとかってやつだったかな、、
Avatar
kateinoigakukun 07-Jun-21 02:16 AM
DYLD_PRINT_LIBRARIES
Avatar
omochimetaru 07-Jun-21 02:16 AM
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift 2021-06-07 11:16:01.228423+0900 swiftc[77103:15204344] Failed to open macho file at /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' passed (1.409 seconds).
しかもなんかエラーが出てるのにコンパイルできて?うごくんだよな
Avatar
Avatar
kateinoigakukun 07-Jun-21 02:16 AM
なんじゃそりゃw
Avatar
omochimetaru 07-Jun-21 02:16 AM
あいや、これ空のテストになっちゃってるのかな?
エラーが素通りしてるかも。
Avatar omochimetaru
うーん、Xcodeのテスト実行からだと Foundation.Process/usr/bin/swiftc を実行しようとすると、
2021-06-05 15:20:12.963749+0900 swiftc[99910:13408271] Failed to open macho file at /Applications/Xcode12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links
Avatar
kateinoigakukun 07-Jun-21 02:17 AM
そもそもこのエラーは誰が出してるんだろう
Avatar
niw 07-Jun-21 02:17 AM
machoがひらけねーよって言ってるからlibcかdylib?
Avatar
omochimetaru 07-Jun-21 02:19 AM
ちょっと打ち合わせなので後で確認しますね
You can generate Swift source code of enum with associated values which complies with SE-0295. - omochi/SE0295Polyfill
👀 1
これクローンしてXcodeで開いてテストするだけ。
Avatar
kateinoigakukun 07-Jun-21 02:20 AM
手元にあったdyldのソースにはToo many levels... の文字列はなかった
Avatar
niw 07-Jun-21 02:20 AM
Foundation.Processつかってるのはどのファイルだろ
Avatar
omochimetaru 07-Jun-21 02:20 AM
JSONCodingTests.swift
Avatar
niw 07-Jun-21 02:22 AM
$ cat main.swift import Foundation let p = Process() p.executableURL = URL(fileURLWithPath: "/usr/bin/env") p.arguments = ["swiftc", "-o", "out", "main.swift"] try p.run() p.waitUntilExit()
これでできたmainを実行するとoutが問題なくできる
testがあやしい?
Avatar
kateinoigakukun 07-Jun-21 02:23 AM
swift test で実行すると再現しないっぽい… テストランナーの問題なのかな
Avatar
omochimetaru 07-Jun-21 02:23 AM
そうなんすよ。
xcode上のテストランナーだけ。
Avatar
niw 07-Jun-21 02:24 AM
swift package initで作られるファイルのインデントがひどいw
Avatar
omochimetaru 07-Jun-21 02:24 AM
なんかいまテストが一弾ずれてますよね
無駄に。
Avatar
niw 07-Jun-21 02:25 AM
swift test ではいいのかー
xcode だとダメ?
Avatar
omochimetaru 07-Jun-21 02:25 AM
はい。
xcodeでPackage.swiftを開いてCmd+Uだと駄目
それが俺だけなのかも知りたいです。
Avatar
kateinoigakukun 07-Jun-21 02:26 AM
ダメですね
generate-xcodeprojで作ったxcodeprojでもダメ
Avatar
niw 07-Jun-21 02:27 AM
え。
Avatar
omochimetaru 07-Jun-21 02:27 AM
再現した?
Avatar
kateinoigakukun 07-Jun-21 02:27 AM
しました
Xcodeのテストランナーと swift test のテストランナーは完全に同じっぽいしわけわからん
Avatar
niw 07-Jun-21 02:28 AM
なにごともなくテストできた
もしかして: 日本語
Avatar
omochimetaru 07-Jun-21 02:28 AM
マジ?
ロケールか?
Avatar
niw 07-Jun-21 02:29 AM
過去の記憶が蘇る
Avatar
kateinoigakukun 07-Jun-21 02:29 AM
僕はあれからjaプライマリーやめました…
Avatar
niw 07-Jun-21 02:29 AM
www
generate-xcodeproj は問題なかった
Package.swift開いてみよう
違うエラーがでた
Library not loaded: @rpath/lib_InternalSwiftSyntaxParser.dylib
Avatar
omochimetaru 07-Jun-21 02:31 AM
あ、それは、
Avatar
niw 07-Jun-21 02:32 AM
bundleがどーとかいう別の問題? (edited)
Avatar
omochimetaru 07-Jun-21 02:32 AM
これ設定してください
SwiftSyntaxのコンパイラ同梱のランタイムライブラリがXcodeからだと見つからないというバグ?がある
Avatar
niw 07-Jun-21 02:33 AM
問題ないですね
少なくともsymlinkがループしてるとはならない
ちなみに、/Applications/Xcode.app に僕の Xcode 12.5 はいる
Avatar
kateinoigakukun 07-Jun-21 02:34 AM
Contribute to kateinoigakukun/SwiftcTooManySymlink development by creating an account on GitHub.
Avatar
niw 07-Jun-21 02:34 AM
Xcode.12.5.app ではない
にたようなミニマムケースつくったけど問題なかったなあ
Avatar
kateinoigakukun 07-Jun-21 02:35 AM
あー、僕はバージョンサフィックス付きのXcodeですね。
Avatar
niw 07-Jun-21 02:35 AM
あやしい
Avatar
omochimetaru 07-Jun-21 02:36 AM
マジか
Avatar
niw 07-Jun-21 02:36 AM
ありえる
enとか、/Applications/Xcode.appとか、行儀良くデフォルトで生きることにしている
Avatar
kateinoigakukun 07-Jun-21 02:37 AM
うーん、でもXcodeのパスはxcode-selectかDEVELOPER_DIRで決定されると思うんだけどなぁ
Avatar
omochimetaru 07-Jun-21 02:37 AM
えっとね、
Avatar
niw 07-Jun-21 02:37 AM
??? 「え、Xcodeって /Applications/Xcode.app にいつもインストールされるんじゃないの??」
😇 1
Avatar
omochimetaru 07-Jun-21 02:38 AM
RPATH探索に Xcode.app が焼き込まれてるファイルを見つけた
Avatar
niw 07-Jun-21 02:38 AM
あー、ありうる
Avatar
omochimetaru 07-Jun-21 02:39 AM
Referenced from: /Library/Developer/Toolchains/swift-5.5-DEVELOPMENT-SNAPSHOT-2021-06-02-a.xctoolchain/System/Library/PrivateFrameworks/LLDB.framework/Versions/A/LLDB
Avatar
kateinoigakukun 07-Jun-21 02:39 AM
ww 行儀悪いな
Avatar
omochimetaru 07-Jun-21 02:39 AM
でもそれは↑これだから、
Avatar
niw 07-Jun-21 02:39 AM
デフォルトの人生が平和
Avatar
omochimetaru 07-Jun-21 02:39 AM
今の話は関係ない
ただまあ他にもあるのかも。
Avatar
niw 07-Jun-21 02:39 AM
独自とかカスタマイズとか悪
日本語とかもってのほか
Avatar
omochimetaru 07-Jun-21 02:39 AM
Avatar
niw 07-Jun-21 02:39 AM
それはさておき名前変えてみよう
Avatar
omochimetaru 07-Jun-21 02:39 AM
Xcodeたくさん必要なんですよ
Avatar
niw 07-Jun-21 02:40 AM
Appple「Macいっぱい買ってください」
Avatar
kateinoigakukun 07-Jun-21 02:40 AM
名前変えるとすべてのキャッシュ壊れそうで怖いなぁw
やってみよう
ダメだ、まだエラー出る
同じエラー
Avatar
niw 07-Jun-21 02:42 AM
xcode-select?
Avatar
omochimetaru 07-Jun-21 02:42 AM
あーいけたー
a
いけてないわ
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift 2021-06-07 11:42:14.894107+0900 swiftc[77512:15232794] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links
Avatar
kateinoigakukun 07-Jun-21 02:43 AM
同じ↑
Avatar
niw 07-Jun-21 02:44 AM
xcodebuild test ではどうですか? (edited)
Avatar
kateinoigakukun 07-Jun-21 02:44 AM
なるほど確かに
Avatar
niw 07-Jun-21 02:44 AM
2021-06-06 19:44:33.440695-0700 swiftc[12611:1786858] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links
(edited)
Avatar
kateinoigakukun 07-Jun-21 02:45 AM
再現した
Avatar
niw 07-Jun-21 02:45 AM
あれかも、メッセージみてなかっただけかも?
テスト失敗はしないというか。
Avatar
omochimetaru 07-Jun-21 02:46 AM
テスト失敗にならないバグがありそうです。
Avatar
niw 07-Jun-21 02:46 AM
xcodebuild -scheme Example-Package -derivedDataPath build test で試してる
@kateinoigakukun さんの再現のほうを。
2021-06-06 19:47:34.100871-0700 swiftc[12779:1790755] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links Apple Swift version 5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)
でますね
Avatar
kateinoigakukun 07-Jun-21 02:49 AM
xcodebuild経由だとこのあたりの環境変数が追加されてることが確認できました
DYLD_FALLBACK_FRAMEWORK_PATH=/Applications/Xcode-12.5.app/Contents/SharedFrameworks:/Applications/Xcode-12.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks DYLD_FALLBACK_LIBRARY_PATH=/Applications/Xcode-12.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib DYLD_FRAMEWORK_PATH=/Users/kateinoigakukun/Library/Developer/Xcode/DerivedData/Example-dcyedciowpcsqebafcorbracmhpk/Build/Products/Debug DYLD_LIBRARY_PATH=/Users/kateinoigakukun/Library/Developer/Xcode/DerivedData/Example-dcyedciowpcsqebafcorbracmhpk/Build/Products/Debug
Avatar
niw 07-Jun-21 02:49 AM
xcodeの場所関係ないかあ...
Avatar
omochimetaru 07-Jun-21 02:53 AM
xcodebuildは、swift package generate-xcodeprojしてから?
Avatar
niw 07-Jun-21 02:53 AM
あ、そうです
dtraceが気楽に使えない昨今
Avatar
omochimetaru 07-Jun-21 02:56 AM
$ xcodebuild -project SE0295Polyfill.xcodeproj -scheme SE0295Polyfill-Package test
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift 2021-06-07 11:57:01.005930+0900 swiftc[78065:15248887] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc for reading: Too many levels of symbolic links Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' passed (2.926 seconds).
Avatar
niw 07-Jun-21 03:00 AM
なにがちがうんだろう
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc を swiftc の代わりに実行するとエラーがでない
つまり... /usr/bin/swiftc を Xcode から実行することに問題がある...?
Avatar
kateinoigakukun 07-Jun-21 03:04 AM
/usr/lib/libxcselect.dylibかな
Avatar
Avatar
kateinoigakukun 07-Jun-21 03:05 AM
/usr/bin/*のshimはこのライブラリ経由でxcode-selectとDEVELOPER_DIRを見て実体のパスを解決してexecするんですよね
Avatar
omochimetaru 07-Jun-21 03:08 AM
ほお
Avatar
niw 07-Jun-21 03:09 AM
$ ls -al /usr/lib/libxcselect.dylib ls: /usr/lib/libxcselect.dylib: No such file or directory
🤔
Avatar
kateinoigakukun 07-Jun-21 03:11 AM
名前忘れちゃったんですけど、一個のdylibに固めてプリロードする技術が使われてて、ローダが特別扱いして対象のパスにファイルが無くても動くんですよ
Avatar
niw 07-Jun-21 03:11 AM
あー、あれか、キャッシュか。
あれの中身みるのしんどい...
Avatar
kateinoigakukun 07-Jun-21 03:12 AM
まず分解するところから…
Avatar
niw 07-Jun-21 03:12 AM
xcselect_invoke_xcrun 実行してるだけだなあ
Avatar
kateinoigakukun 07-Jun-21 03:13 AM
そうそう
Avatar
niw 07-Jun-21 03:13 AM
それは闇の中...
Avatar
kateinoigakukun 07-Jun-21 03:13 AM
デバッガアタッチする方が楽かも
Avatar
niw 07-Jun-21 03:14 AM
許されるのかなあ
Avatar
kateinoigakukun 07-Jun-21 03:16 AM
許された?
Avatar
niw 07-Jun-21 03:16 AM
swiftc -vlldb swiftc に置き換えてみた
Avatar
kateinoigakukun 07-Jun-21 03:19 AM
なるほど、それでいけるんですね
Avatar
niw 07-Jun-21 03:19 AM
interactiveがないからきつい...
Not allowed to attach to process.
Avatar
kateinoigakukun 07-Jun-21 03:20 AM
ww 許されなかったか… (edited)
Avatar
niw 07-Jun-21 03:20 AM
だめだった
なぞい
sip止めるのはいやだなあ
libxcselect がなにかすごいことをしてるような気がする
Avatar
kateinoigakukun 07-Jun-21 03:25 AM
アタッチ出来た!
Avatar
niw 07-Jun-21 03:25 AM
お??
xpc...
Avatar
kateinoigakukun 07-Jun-21 03:27 AM
Attach to Process or Name...でDebug Process Asをrootにしてデバッガ待機させて、横でテスト実行すると捕まえられました
Avatar
niw 07-Jun-21 03:27 AM
rootいるのw
Avatar
kateinoigakukun 07-Jun-21 03:28 AM
root無いと捕まらないですw
そしてcontinueすると途中でEXC_BAD_ACCESSで死ぬ…
Avatar
niw 07-Jun-21 03:31 AM
うーん...
インターネットにばらした libxcselect.dylib ないかな
libxcselect.dylib がなんらかのチェックをしていそう
Avatar
kateinoigakukun 07-Jun-21 03:33 AM
Modifications to Apple&#39;s dyld project to fix Objective-C information when extracting dyld_shared_cache from macOS Big Sur to help Hopper generate readable pseudocode. - antons/dyld-shared-c...
Avatar
niw 07-Jun-21 03:33 AM
それがなんかバグってそう...
ばらしたの置いてないかなあ...
Avatar
Avatar
Avatar
kateinoigakukun 07-Jun-21 03:37 AM
思い出した。Shared CacheになったのはBig Surからなのでそれ以前のOSにはバラで入ってたんだ
Avatar
niw 07-Jun-21 03:37 AM
iOSでは結構前からそんななんですよね
Big Surからなのか
とりだせた
👏 1
悲報: M1なのでARM64
あれ?
これx64だな
不思議
Avatar
kateinoigakukun 07-Jun-21 03:41 AM
Universalになっててよかった!
Avatar
Avatar
kateinoigakukun 07-Jun-21 03:45 AM
_xcselect_invoke_xcrun_via_libraryが実は本質?
Avatar
niw 07-Jun-21 03:46 AM
libxcrunを使ってる
Avatar
kateinoigakukun 07-Jun-21 03:46 AM
libxcrunはDEVELOPER_DIRの配下にバラで置いてありますね
Avatar
niw 07-Jun-21 03:46 AM
したのほうに_xcselect_invoke_xcrun_via_libraryのpsudo コード追加した
Avatar
kateinoigakukun 07-Jun-21 03:49 AM
xcrun_main
Avatar
niw 07-Jun-21 03:49 AM
めっちゃでかい
Avatar
kateinoigakukun 07-Jun-21 03:50 AM
普通にxcrunコマンド本体ですねw
Avatar
niw 07-Jun-21 03:50 AM
追加した
あった!!
_parse_macho_iterate_slices
Avatar
kateinoigakukun 07-Jun-21 03:51 AM
お!
ヤッタ~ 🙌
Avatar
niw 07-Jun-21 03:52 AM
_parse_macho_iterate_slices_fd がエラーだなぁ
fstat してるからそれがなんかおかしなことになってしまってる?
あ、ちがうか、_parse_macho_iterate_slicesopen ですでにダメなのか
_parse_macho_iterate_slices にブレイクポイントいれらたら
$arg0 ($rdi) をみればパスがわかるはず (edited)
(intel macなら)
Avatar
kateinoigakukun 07-Jun-21 03:55 AM
少々お待ち
Avatar
niw 07-Jun-21 03:56 AM
えー、それopenするとエラー??
Avatar
kateinoigakukun 07-Jun-21 03:56 AM
というかr15はエラーメッセージに出てましたねw
なんでopen出来ないんだろう
Avatar
niw 07-Jun-21 03:57 AM
わたしてるフラグは 0b100000000
Avatar
kateinoigakukun 07-Jun-21 03:58 AM
let ret = open("/Applications/Xcode-12.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc", 0x100) print(ret)
これは-1が返ってくる
swift testでもxcodebuildでも両方同じ値が返ってくる
print(String(cString: strerror(errno))) するとToo many levels of symbolic linksだ
Avatar
niw 07-Jun-21 04:00 AM
swift testはxcrunつかわない疑惑 (edited)
Avatar
kateinoigakukun 07-Jun-21 04:01 AM
なるほど?xcodeのランナーのほうが実は自然でswift-testのハックでxcrun経由にならずエラーが握りつぶされてる説? (edited)
Avatar
niw 07-Jun-21 04:03 AM
#define O_NOFOLLOW 0x00000100 /* don't follow symlinks */
😂
Avatar
kateinoigakukun 07-Jun-21 04:03 AM
Avatar
niw 07-Jun-21 04:03 AM
これは、、、
バグですね
つまり、xcrunのバグかな。 (edited)
libxcrun的にはなんか実行するまえにmachoを読んでなんかチェックしたいんだけど (目的は読まないとわからない) (edited)
symlink追いたくない
でも、xcrunでswiftcを呼ぶとそれはsymlinkされてる
まあなんだろう、バグっていうか仕様の行き違い
Avatar
kateinoigakukun 07-Jun-21 04:05 AM
うーん、でもそうするとエラー出さずに正常に動くケースがよくわからないですね
Avatar
niw 07-Jun-21 04:05 AM
_parse_macho_iterate_slices 呼ばないケースがあるんだと思う
Avatar
kateinoigakukun 07-Jun-21 04:06 AM
あと、_parse_macho_iterate_slicesが0を返すケース追っていくとその後で普通にexecvされてるっぽいですよ
Avatar
niw 07-Jun-21 04:06 AM
syslog$DARWIN_EXTSN(0x3, "Failed to open macho file at %s for reading: %s", r15, strerror(*(int32_t *)__error())); rax = 0x0;
だからまあ気にしないのかな...
Avatar
kateinoigakukun 07-Jun-21 04:07 AM
つまりswift-testでもxcodeでもこのsyslogの行には到達してるけど、環境変数か何かしらでログを出力するか制御されてるってことかな
Avatar
niw 07-Jun-21 04:08 AM
open できた場合の _parse_macho_iterate_slices_fd はMach-Oを検証してる感じかなあ
そうかも
あるいは _parse_macho_iterate_slices 呼ばれてない?
呼ばれてる?
Avatar
kateinoigakukun 07-Jun-21 04:09 AM
たしかに。そこは確かめたい
swift-testで実行してる/usr/bin/swiftcをデバッガで捕まえれば良いのか
呼ばれてましたね
Avatar
niw 07-Jun-21 04:10 AM
なるほど...
syslogか
Avatar
kateinoigakukun 07-Jun-21 04:14 AM
OS_ACTIVITY_DT_MODE=YES これだ!
これセットするとswift-testでもエラーログ出るようになります (edited)
完全に理解してしまった…
Avatar
niw 07-Jun-21 04:17 AM
やった
すごい時間かかった...
Avatar
kateinoigakukun 07-Jun-21 04:17 AM
そして何も問題は無かった‥
Avatar
niw 07-Jun-21 04:18 AM
www
いや、どうだろう
Avatar
kateinoigakukun 07-Jun-21 04:18 AM
なんか昔Xcodeが異常にログを出すようになったときこの環境変数セットすると抑えられていいよ!みたいなTipsありましたね
Avatar
niw 07-Jun-21 04:18 AM
xcrunがsymlink追わずにexecvするのどうなのとは思う
そうじゃない場合はmach-oのヘッダーとか確認してるわけだし...
Avatar
omochimetaru 07-Jun-21 04:19 AM
めちゃくちゃ解析が進んでる
Avatar
kateinoigakukun 07-Jun-21 04:19 AM
確かに。symlink経由だとその検証をバイパスできるってことですもんね
Avatar
niw 07-Jun-21 04:19 AM
TL; DR: 何も問題がなかった
Avatar
omochimetaru 07-Jun-21 04:20 AM
ええ
Avatar
niw 07-Jun-21 04:20 AM
少なくとも、開発環境という意味では...
Avatar
kateinoigakukun 07-Jun-21 04:20 AM
気になる場合はOS_ACTIVITY_DT_MODE=NOを実行時に環境変数にセットしよう (edited)
Avatar
omochimetaru 07-Jun-21 04:21 AM
Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' started. generate: Command-SE0295.gen.swift Test Case '-[SE0295PolyfillTests.JSONCodingTests test01]' passed (1.140 seconds). Test Case '-[SE0295PolyfillTests.JSONCodingTests test02]' started. generate: Command-SE0295.gen.swift Test Case '-[SE0295PolyfillTests.JSONCodingTests test02]' passed (0.935 seconds). Test Case '-[SE0295PolyfillTests.JSONCodingTests test03]' started. generate: Command-SE0295.gen.swift Test Case '-[SE0295PolyfillTests.JSONCodingTests test03]' passed (0.933
Avatar
niw 07-Jun-21 04:21 AM
あるいはシェルのどこかに OS_ACTIVITY_DT_MODE=YES しておけば、いつでも Xcode と同じ気持ちになれる (edited)
Avatar
omochimetaru 07-Jun-21 04:21 AM
なおった!
Avatar
niw 07-Jun-21 04:22 AM
すごい学びはあったけど、実用性に乏しいw
Avatar
kateinoigakukun 07-Jun-21 04:23 AM
ww
対戦ありがとうございました
Avatar
niw 07-Jun-21 04:24 AM
FBにセキュリティでsymlinkだと無視されるほーんって書いておこう
Avatar
Kishikawa Katsumi 07-Jun-21 04:24 AM
おもしろい。けっきょくどっちでも同じ挙動をしていてログのVerboseモードが有効になってるかどうか、ってこと?
Avatar
niw 07-Jun-21 04:25 AM
まそんな感じです
Avatar
Kishikawa Katsumi 07-Jun-21 04:25 AM
おつかれさまです。
Avatar
omochimetaru 07-Jun-21 04:25 AM
ログのVerboseモードが有効になってるかどうか
ん、じゃあ、動いてたの?
エラーメッセージが出るだけで。
Avatar
kateinoigakukun 07-Jun-21 04:25 AM
そうなんです
Avatar
niw 07-Jun-21 04:25 AM
ですです
Avatar
omochimetaru 07-Jun-21 04:26 AM
なるほど・・・・・・・
Avatar
niw 07-Jun-21 04:26 AM
この else 側を通ってます
ただ、このエラーメッセージ、syslog経由なので普通にはstderrにでません
FB9129541った
Avatar
kateinoigakukun 07-Jun-21 04:31 AM
👏
Avatar
niw 07-Jun-21 04:31 AM
env OS_ACTIVITY_DT_MODE=1 swiftc がminimum reproです
Avatar
omochimetaru 07-Jun-21 05:08 AM
打ち合わせ終わったので読み直してきた レベルたけー
Avatar
niw 07-Jun-21 05:20 AM
Hopper Disassembler さまさま
Avatar
kateinoigakukun 07-Jun-21 05:22 AM
生のディスアセンブル結果とは比べ物にならないくらい読みやすかったので、今度買おうと思いました
Avatar
niw 07-Jun-21 05:23 AM
まあ今回は読みやすいコードだったと思う
そんなに高くないし気楽につかえるし持ってて損はないと思う
💸 1
Avatar
kateinoigakukun 08-Jun-21 12:43 AM
新しいランタイムをアプリに埋めて、古いOSに出荷する、みたいなことができない理由にshared cacheが関わってるカモという話が出てた https://twitter.com/uint_min/status/1402050350249504772?s=21 (edited)
@zhuowei The Swift stdlib is part of the OS and specifically part of the dyld shared cache; you can't replace it for just one app.
🥺 1
Avatar
omochimetaru 08-Jun-21 12:44 AM
Concurrencyモジュールは普通に埋めて出荷できるもんだと期待していたのに
Avatar
niw 08-Jun-21 12:45 AM
iOS はキャッシュしてるから...
そしてbig surも
Avatar omochimetaru
Concurrencyモジュールは普通に埋めて出荷できるもんだと期待していたのに
Avatar
kateinoigakukun 08-Jun-21 12:45 AM
その可能性はまだちょっと期待してる
Avatar
niw 08-Jun-21 12:45 AM
(記憶に新しい)
Avatar
kateinoigakukun 08-Jun-21 12:45 AM
(記憶に新しい)
Concurrencyモジュールが古いlibswiftCoreと一緒に動くかどうかが問題ですね
Avatar
omochimetaru 08-Jun-21 12:47 AM
stdlib自体はcompatibility hookの仕組みもあるじゃない。
Avatar
niw 08-Jun-21 12:48 AM
apple「みんなあたらしいiOSが乗ったiPhoneかったらいいよね」
Avatar
omochimetaru 08-Jun-21 12:48 AM
流石に端末切り捨てはしないからアプデいれてもろて
Avatar
niw 08-Jun-21 12:48 AM
まあでも、iOS13/14/15でハードの切り捨てがないから
iOSのアプデ拒否れないようにすればいい
なんかもう10回くらい
Avatar
omochimetaru 08-Jun-21 12:49 AM
拒否れないはアツいな。
Avatar
kateinoigakukun 08-Jun-21 12:49 AM
w
Avatar
niw 08-Jun-21 12:49 AM
いいえっていって設定の10階層めくらいにそういうトグルいれておけばいい
Avatar
tarunon 08-Jun-21 12:51 AM
束の間の平和、数年ぐらいでEU辺りに法で破壊されそう
Avatar
niw 08-Jun-21 12:52 AM
EU...
GDPR...
Cookie地獄
Avatar
kateinoigakukun 08-Jun-21 02:27 AM
The release notes imply that this is an "issue" that just needs to be fixed. It's not.
https://forums.swift.org/t/swift-concurrency-feedback-wanted/49336/6
(edited)
Concurrency requires runtime support that does not backward deploy. The release notes imply that this is an "issue" that just needs to be fixed. It's not. It's a feature that would need to be implemented. At this time, folks should assume that concurrency does not backward deploy. That said, everyone is aware of the value of it doing so, an...
😂 1
Avatar
omochimetaru 08-Jun-21 02:31 AM
That said, everyone is aware of the value of it doing so, and is something that is being explored/considered.
今の所やらんけど技術的には可能ってこと?
Avatar
kateinoigakukun 08-Jun-21 02:43 AM
どうなんだろう。まあ頑張ればどうにでもなりそうだけど…
Avatar
yutailang0119 08-Jun-21 03:35 AM
https://twitter.com/rjonesy/status/1401978873944944644 で、今後OSメジャーアップデート渋るユーザーが増えるか
iOS 15: Ruh row, users may adopt iOS updates slower.
Avatar
Aryzae 08-Jun-21 03:37 AM
Majorバージョンをユーザー主導で選べるのかぁ 15にあげたら14に戻すことはできないだろうから、慎重にはなりそう
Avatar
niw 08-Jun-21 03:37 AM
えー。
これはちょっと。
Avatar
Aryzae 08-Jun-21 03:38 AM
15でバグだらけだと正式リリースしてもbeta版じゃんと言われて渋られるのでOSの出来次第か?
アプリもどうせ2Majorバージョンサポートって考えると問題なさそうにも見える
Avatar
niw 08-Jun-21 03:42 AM
どうだろうなあ。
やっぱりasync/awaitは1年育てる方向か
Avatar
omochimetaru 08-Jun-21 03:43 AM
サーバーサイドで先走りしちゃお
Avatar
niw 08-Jun-21 03:44 AM
サーバーは他の言語が...
実際のところ、同じだと嬉しいかな。
Avatar
rinsuki 08-Jun-21 04:26 AM
自分用で iOS 15 required にしても問題ない小さいアプリを google/promises の疑似async/awaitから Swift 5.5 の async/await に移行したんですが、めっちゃ普通に動いて感心してしまった
Avatar
omochimetaru 08-Jun-21 04:26 AM
イイネイイネ
Avatar
rinsuki 08-Jun-21 04:27 AM
欲を言うと URLSession.shared.data(for:) が名前付きタプルになるといいな…という感じがした
Avatar
omochimetaru 08-Jun-21 04:27 AM
(URLResponse, Data) ?
Avatar
rinsuki 08-Jun-21 04:27 AM
それですそれです
let hogeRes = try await URLSession.shared.data(for: hogeReq) // いろいろ let hogeData = hogeRes.0
ってなるのはちょっとダサさがあり…
Avatar
Kishikawa Katsumi 08-Jun-21 04:28 AM
Result返さないのか
Avatar
omochimetaru 08-Jun-21 04:28 AM
エラーは throws なので。
Avatar
Kishikawa Katsumi 08-Jun-21 04:29 AM
throwsなのか!
Avatar
omochimetaru 08-Jun-21 04:29 AM
let (res, data) = try await URLSession... で受けると良いかも?
Avatar
rinsuki 08-Jun-21 04:30 AM
とりあえずそうしたんですが、res と data 一緒に持って行きたいときに引数2つ持たないといけないのがアレかなあという気がしています
Avatar
omochimetaru 08-Jun-21 04:30 AM
まあそうですね。
Avatar
rinsuki 08-Jun-21 04:30 AM
(data: Data, response: URLResponse) とかになってくれるとうれしい
feedback書いてみようかな
Avatar
omochimetaru 08-Jun-21 04:31 AM
struct DataTaskResult とかで nominal type でも良い気がするけど(自分はそうラップしている) (edited)
Avatar
Kishikawa Katsumi 08-Jun-21 04:31 AM
手元で使う場合はAPIClientクラスか何かでラップしてそんなのを返すのがよさそうですねえ。
Avatar
omochimetaru 08-Jun-21 04:33 AM
手元
Avatar
Kishikawa Katsumi 08-Jun-21 04:33 AM
https://developer.apple.com/documentation/foundation/urlsession/3767353-data?changes=latest_minor このへんか。 でもResponseとDataがOptionalじゃなくなったのはとてもいい。
Avatar
omochimetaru 08-Jun-21 04:34 AM
オプショナルトリオでよくわかんなかったですもんね
Avatar
Kishikawa Katsumi 08-Jun-21 04:35 AM
ResultかErrorをthrowsで分離できなかったからしょうがないのかな。 コールバックを分けるという手はあったと思うけどたぶん使いにくいな。 (edited)
Avatar
rintaro 08-Jun-21 04:38 AM
ラベル付きタプル、Objective-C Interop の機能で async 化されてるんだとしたら、https://github.com/apple/swift-evolution/blob/main/proposals/0297-concurrency-objc.md#asynchronous-completion-handler-methods で議論されなかったのかな。
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 08-Jun-21 04:38 AM
Objective-C Interop
あ〜それがあるのか!
すっかり忘れてた。
Avatar
rinsuki 08-Jun-21 04:41 AM
https://developer.apple.com/documentation/foundation/urlsession/3767352-data?changes=latest_minor は素の Objective-C Interop ではないと思います (そもそも元の dataTask(...) は URLSessionDataTask が帰ってくるはずなので The method itself has a void result type, because all results are delivered by the completion handler block. に引っかかりそう)
Avatar
omochimetaru 08-Jun-21 04:43 AM
なるほど。
Avatar
rintaro 08-Jun-21 04:43 AM
なるほど、そしたら overlay モジュールか。 とはいえ SE-0297 の変換に寄せたのかもしれませんね。
Avatar
omochimetaru 08-Jun-21 04:43 AM
同期返り値があるやつはたしかにそれの行き先がないもんな。
自動変換だとそもそもクロージャの引数のラベルはシグネチャの中に無いからタプルになっちゃうなあ。
Avatar
Avatar
omochimetaru 08-Jun-21 04:45 AM
ほんまや。
Avatar
Avatar
Kishikawa Katsumi 08-Jun-21 04:46 AM
あれ、そういえばクロージャじゃなくてDelegateで非同期処理のコールバックを受けるものはどうやってasync/awaitに変換するんでしたっけ?
Avatar
rinsuki 08-Jun-21 04:46 AM
そうか、ObjCの定義には引数名載っててもSwiftの定義には引数名乗らないんですね
Avatar
Kishikawa Katsumi 08-Jun-21 04:46 AM
Delegateの部分を自分でクロージャのコールバックにするようにラップするのか。。。?
Avatar
rintaro 08-Jun-21 04:48 AM
ObjCの定義には引数名載っててもSwiftの定義には引数名乗らない
型システム的には無視されるけど、 (_ data: Data?, _ response: URLResponse?, _ error: Error?) -> Void というシンタックスはあるので、引数名乗るようにインポートすることは可能なはずです。
Avatar Kishikawa Katsumi
Delegateの部分を自分でクロージャのコールバックにするようにラップするのか。。。?
Avatar
omochimetaru 08-Jun-21 04:49 AM
Delegateオブジェクトはretainされないから、 グローバル変数のSetに入れるか、Unmanaged越しにmanual retainして、 コールバック完了時かキャンセル時に解放を書く
というのが一番汎用的な書き方になるはず。 もうちょっとサボるなら、メソッドを持ってるオブジェクト自体に objc_setAssociatedObject でデリゲートオブジェクトをぶら下げる手もあります。(この場合、2回呼び出しの対応が面倒)
Avatar
Kishikawa Katsumi 08-Jun-21 04:51 AM
URLSessionでいうとURLSessionを拡張してうまくやろうとするとそんな感じで大変だけど、それを保持しているラップするオブジェクトを作ってそれ自身をデリゲートにしたら生存期間の問題は解決しません?
Avatar
omochimetaru 08-Jun-21 04:52 AM
ラップするならそれでもいいです。
あと、複数回呼び戻されるタイプのデリゲートの場合は、AsyncSequenceへの変換が良いですね。
Avatar
Kishikawa Katsumi 08-Jun-21 04:53 AM
ということですよね。 まとめると、具体的にラップするかそのものを拡張するかは置いておいて、 いったんDelegateモデルを変換するというステップが必要で、そのあとはクロージャのコールバックとかと同じようにAsync/Awaitに変換すれば良い?
Avatar
omochimetaru 08-Jun-21 04:53 AM
あ、そうですね。 従来と同じで、デリゲートスタイルをクロージャスタイルに変換する事をまず考えて、 その後クロージャスタイルをasyncにするのが良いと思います。
Avatar
Kishikawa Katsumi 08-Jun-21 04:54 AM
どうもどうも。ありがとうございます。
まあDelegateの非同期処理ってもうないよな多分。 Bluetoothとかそうだったっけ?
Avatar
omochimetaru 08-Jun-21 04:57 AM
UITextFieldDelegateとかよく使う
ので、ラップしている。 (edited)
Avatar
rintaro 08-Jun-21 04:59 AM
https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md delegate はAsyncSequenceよりAsyncStreamのほうが使い易くなるはず (edited)
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
Avatar
omochimetaru 08-Jun-21 05:00 AM
AsyncSequenceにするための変換器がAsyncStreamですよね?
Avatar rinsuki
(data: Data, response: URLResponse) とかになってくれるとうれしい
Avatar
rinsuki 08-Jun-21 05:00 AM
この feedback どこに書くと良いんだろう? Feedback Assistant の Developer Tools トピックでいいのかな
👍 1
Avatar
omochimetaru 08-Jun-21 05:00 AM
asyncにするためのContinuationの関係と同じ。
👍 1
Avatar
rintaro 08-Jun-21 05:01 AM
あー、そういう関係か
Avatar
omochimetaru 08-Jun-21 05:01 AM
バッファリングとかあるから生の変換器ではないですが。
Avatar
Kishikawa Katsumi 08-Jun-21 05:03 AM
なるほど。UITextFieldとかのイベントも非同期処理と捉えるのか。
RxCocoaがやってくれるやつね。
Avatar
trickart 08-Jun-21 05:46 AM
UIViewController.h見てたらpresentViewControllerに NS_SWIFT_DISABLE_ASYNC というのが追加されているのでこれがあるやつはasyncに自動変換されないって感じなんですかね。
// 14.5 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion API_AVAILABLE(ios(5.0)); // 15.0 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_SWIFT_DISABLE_ASYNC API_AVAILABLE(ios(5.0));
Avatar
Kishikawa Katsumi 08-Jun-21 05:51 AM
なるほど。同期的に呼ばれるものかそうじゃないのかはシグネチャだけだと区別できないからそれをつける必要があるんですね。
同期的に呼ばれるものかそうじゃないのか、っておかしいな。上のAPIも非同期的に呼ばれることには変わりない。
Avatar
tarunon 08-Jun-21 05:53 AM
asyncのapiとして提供するべきでは無いものにアトリビュートしてる感じですね
Avatar
Kishikawa Katsumi 10-Jun-21 12:58 PM
On performance. I have a 4500-lines enum for emojis in Unicode, so I can order them and move them around. In the functions I declared (such as one providing the group, or subgroup), I'm damned either way: if I don't put a default: fatalError() at then end of it, I have a compiler too slow error. If I put it, I have a Default will never be executed. Best of all, I cannot disable the warning in the package, so I'm left with 4 warnings at all times. Anything I can do?
Dev Loungeから。 やっぱりそれくらいメンバの多いEnumとかStructを使うケースってあるんだなあと興味深い。
Avatar
omochimetaru 10-Jun-21 12:59 PM
4500もあったらどうせコードとしてメンテナンスできないのでは・・・
switch文ひとつすらレビュー不可能ですよ
Avatar
Kishikawa Katsumi 10-Jun-21 01:00 PM
まあでもUnicodeの絵文字は規格が先にあるから扱えるんじゃないかな。
Avatar
omochimetaru 10-Jun-21 01:00 PM
規格書から作った定義表みたいなデータドリブンで実装するべきで (edited)
コードとして分岐を作るのはナンセンスに思えます
まあコンパイルが遅くならないに越した事はないですけど。。。 (edited)
Avatar
Kishikawa Katsumi 10-Jun-21 01:02 PM
回答としてはテストケース的な小さいプロジェクトにしてバグレポートを出してくれたら改善できるかも、ということでした。
遅くなるのが4500件なのかもっと早く訪れるのかわからないけど、コンパイラ側としてはそれが後になってればその方がいいんじゃないかな。
Avatar
omochimetaru 10-Jun-21 01:03 PM
そうですね。
Avatar
Kishikawa Katsumi 10-Jun-21 01:03 PM
何件からナンセンスかは場合によりそう。
Avatar
omochimetaru 10-Jun-21 01:03 PM
一つ一つのケースで異なるロジックが必要になるかどうかですね。
対応するプロパティを引っ張るだけとかだったら、データ定義に移して一つのコードにまとめられる。
Avatar
Kishikawa Katsumi 10-Jun-21 01:05 PM
なるほど。
Avatar
omochimetaru 10-Jun-21 01:06 PM
同じようなもののバリエーション違いってenumにしてもあまり恩恵がなくて、structとstatic funcの方がうまくまとまる事がありがちに思います
enumがメリットが大きいのってcaseごとに全然違うものが現れる場合です OptionalとかResultは良い例 (edited)
Avatar
Kishikawa Katsumi 10-Jun-21 01:08 PM
そうですねえ。補完もほぼ同じように働いて、見た目も一緒になることが多いですしね。
Avatar
omochimetaru 10-Jun-21 01:08 PM
例えば麻雀牌136種とかポケモン898種とかをenumにするのってあんまり意味ないと思ってます。
Avatar
Kishikawa Katsumi 10-Jun-21 01:09 PM
なるほど?麻雀牌はなんとなく意味があるケースもありそうな気がするのでちょっと考えてみよう。
うーん、でもEnumにはしないかなあ。
Avatar
omochimetaru 10-Jun-21 01:10 PM
むしろ赤牌とかが出てきて困ったりする。 「字牌か、数字か」みたいな属性を表す部分ではenumを使うとうまくいきますね
Avatar
Kishikawa Katsumi 10-Jun-21 01:10 PM
なるほど。
Avatar
Kishikawa Katsumi 10-Jun-21 01:23 PM
昨日クイズ大会とかDev Loungeであったっぽい。見逃した。
Avatar
Kishikawa Katsumi 10-Jun-21 01:33 PM
Might the upcoming Playgrounds release include support for find & replace, or refactoring? Renaming variables, or indeed any declaration, can be quite painful without it. Or if you can't comment - are there any good workarounds for this currently?
この質問とかいいな。確かにリファクタリング機能があるかどうかは仕事でも使えるかっていう点では大きい。
Avatar Kishikawa Katsumi
遅くなるのが4500件なのかもっと早く訪れるのかわからないけど、コンパイラ側としてはそれが後になってればその方がいいんじゃないかな。
Avatar
rintaro 10-Jun-21 02:07 PM
https://twitter.com/codafi_/status/1402424392156471296?s=21 実際テストケース提供いただいて修正入っております。
Report bugs to us during WWDC. They get fixed. https://t.co/mJInJJOmDN
👏🏼 1
Avatar
Kishikawa Katsumi 10-Jun-21 02:08 PM
私もそれ見ました。確かに時間かかるなあと。
Avatar
omochimetaru 12-Jun-21 12:20 AM
This was a great conversation, thanks John! Swift’s concurrency model was the work of a fantastic group of brilliant engineers. @pathofshrines architected the feature, from its expression in the language down to the lowest-level runtime and compiler details. https://t.co/UjvPXTVeRj
Likes
158
スタッフロール ちょいちょい名前覚えてるから壮観
Avatar
koher 14-Jun-21 12:54 AM
こんなの見かけたんですが、わかる人いますか? https://twitter.com/__KameKun__/status/1403397797378809861
これ原因わかる方いますか? 無意味なprint文をコメントアウトするだけで配列の中身が変わってしまうんですが、、、 手元だと動くからSwift5.2.1のバグなのかなと思いつつも分からず
↓書き写してみたコード。
func readInts() -> [Int] { return readLine()!.split(separator: " ").map {Int(String($0))!} } func main() { let K = Int(readLine()!)! if !K.isMultiple(of: 9) { print(0) return } var dp: [Int] = Array(repeating: 0, count: K+1) dp[0] = 1 for i in 1...K { for j in max(0, i-9)..<i { dp[i] = (dp[i] + dp[j]) % (Int(1e9) + 7) //print(terminator: "") } } print(dp[K]) } main()
AtCoder環境は -Ounchecked 付きでコンパイルされます。(追記) Linux です。 (edited)
Avatar
masakihori 14-Jun-21 07:34 AM
256と1っていうのが16bit整数とその上位8bitっぽい
けど全く意味が分からんな
Avatar
niw 14-Jun-21 07:40 AM
readInts() は使ってない?
Avatar
masakihori 14-Jun-21 08:01 AM
let K = [9].randomElement()!にしてここのSwift-5.2.5君に -Ounchecked で食わせても1にならない
Avatar
koher 14-Jun-21 08:12 AM
readInts() は使ってなさそうですね。
Avatar masakihori
let K = [9].randomElement()!にしてここのSwift-5.2.5君に -Ounchecked で食わせても1にならない
Avatar
koher 14-Jun-21 08:12 AM
Linux ですか?あと、 5.2.1 じゃないと発生しないのかもですね。
Avatar
norio_nomura 14-Jun-21 11:31 AM
swift-5.2.5-RELEASE for ubuntu 16.04で再現しますね。-Ouncheckedを外すと起きない。
$ pbpaste func main() { let K = Int(readLine()!)! if !K.isMultiple(of: 9) { print(0) return } var dp: [Int] = Array(repeating: 0, count: K+1) dp[0] = 1 for i in 1...K { for j in max(0, i-9)..<i { dp[i] = (dp[i] + dp[j]) % (Int(1e9) + 7) //print(terminator: "") } } print(dp[K]) } main() $ pbpaste|docker run -i norionomura/swift:5.2 sh -c 'swiftc -Ounchecked -; echo 9|./main' 1 $ pbpaste|docker run -i norionomura/swift:5.2 sh -c 'swiftc -; echo 9|./main' 256 $ pbpaste|docker run -i norionomura/swift:5.3 sh -c 'swiftc -Ounchecked -; echo 9|./main' 256 $ pbpaste|docker run -i norionomura/swift:5.3 sh -c 'swiftc -; echo 9|./main' 256
(edited)
swift-5.3.3-RELEASEでは起きない。
Avatar
Kishikawa Katsumi 20-Jun-21 01:50 AM
#20 1.569 [2215/2636] Compiling _NumericsShims _NumericsShims.c #20 1.623 [2216/2637] Compiling _AtomicsShims.c #20 1.623 [2217/2637] Compiling CSystem shims.c #20 3.014 [2218/2637] Compiling RealModule AlgebraicField.swift #20 4.016 [2219/2640] Compiling DequeModule Compatibility.swift #20 6.883 SIL memory lifetime failure in @$s13ComplexModule0A0V3logyACyxGAEFZ: memory is not initialized, but should #20 6.883 memory location: %98 = alloc_stack $RealType, let, name "θ" // users: %392, %390, %234, %235, %406, %247, %100 #20 6.883 at instruction: copy_addr %98 to [initialization] %391 : $*RealType // id: %392 #20 6.883 #20 6.883 in function: #20 6.883 // static Complex.log(_:) #20 6.883 sil [serialized] [ossa] @$s13ComplexModule0A0V3logyACyxGAEFZ : $@convention(method) <RealType where RealType : Real> (@in_guaranteed Complex<RealType>, @thin Complex<RealType>.Type) -> @out Complex<RealType> {
swift-numericsがこんな感じのエラーでDocker上でだけビルドできないっていうのにずっと悩んでたけど、Dockerに割り当てるリソースを増やしたら解決した。 CIでもちょっと内容は違うけど似たようなところで失敗していてそれは -j 1 を指定したらビルドできるようになった。 SIL memory lifetime failure ってなんだろうってずっと悩んでいた。
Swift 5.3の場合は問題なくて5.4以上のときだけこの問題が起こって、Ubuntuのバージョンを16に下げた場合も微妙に直るみたいな挙動をしていたので原因を見落とした。
Avatar
Kishikawa Katsumi 21-Jun-21 01:53 AM
SourceKit-LSPをWebSocketでつないでめちゃめちゃコード補完できるようにした。 (edited)
👏 5
Avatar
omochimetaru 21-Jun-21 01:53 AM
すげえ
Avatar
Kishikawa Katsumi 21-Jun-21 01:53 AM
ホバーしたらヒントも出る。
Avatar
omochimetaru 21-Jun-21 01:53 AM
LSP使ってIDE作れちゃうやつを実際にやったってことですね
Avatar
niw 21-Jun-21 01:54 AM
1セッションごとにlspサーバーが起動するのかな... (edited)
Avatar
Kishikawa Katsumi 21-Jun-21 01:54 AM
まあLSPはSwiftのBindingあるし、表示やポップアップのトリガーはMonaco Editorにおまかせだからホント繋いだだけ。
1セッションごとに1プロセスですね。
Avatar
niw 21-Jun-21 01:55 AM
実はwasmでローカルで動いてるのかな (edited)
なるほど
Avatar
Kishikawa Katsumi 21-Jun-21 01:55 AM
なんかワークスペースは1つで複数のファイルを開いている、という状態にしたかったんですけど、なんかLSPがクラッシュしてうまくいかないんですよね。
苦肉の策。打開策はありそう。
Avatar
kateinoigakukun 21-Jun-21 01:56 AM
ワークスペース共有しちゃうと、他の人のドキュメント見れちゃってマズそう
Avatar
niw 21-Jun-21 01:57 AM
むしろそれが楽しそう
誰かがextension書くと自分がつかえる
Avatar
omochimetaru 21-Jun-21 01:58 AM
Avatar
Kishikawa Katsumi 21-Jun-21 01:58 AM
確かにそう実装すると他の人が書いたメソッドが補完に出てくるのか!
Avatar
kateinoigakukun 21-Jun-21 01:58 AM
ww
Avatar
Kishikawa Katsumi 21-Jun-21 01:59 AM
AIによるコード補完という製品をみたけどそれのめっちゃ低レベル版って感じだ。
Avatar
niw 21-Jun-21 01:59 AM
AI (他人)
Avatar
kateinoigakukun 21-Jun-21 02:00 AM
人工じゃない知能だ
Avatar
koher 25-Jun-21 10:26 AM
@swift-5.4.3
func foo(completion: @escaping () -> Void) {} final class C { var a: Int = 0 func bar() { foo { [self] in a += 1 } } }
Avatar
swift54 BOT 25-Jun-21 10:26 AM
no output
Avatar
koher 25-Jun-21 10:26 AM
@swift-5.4.3
func foo(completion: @escaping () -> Void) {} final class C { var a: Int = 0 func bar() { foo { [weak self] in guard let self = self else { return } foo { [self] in a += 1 } } } }
Avatar
swift54 BOT 25-Jun-21 10:26 AM
exit status: 1 with stderr:
<stdin>:8:17: error: reference to property 'a' in closure requires explicit use of 'self' to make capture semantics explicit a += 1 ^ <stdin>:7:20: note: variable other than 'self' captured here under the name 'self' does not enable implicit 'self' foo { [self] in ^ <stdin>:7:20: warning: capture 'self' was never used foo { [self] in ^
Avatar
koher 25-Jun-21 10:26 AM
一度 weak self を介すると [self] は使えないのか。
Avatar
koher 02-Jul-21 12:29 AM
↓みたいな本来 preconditionFailure だけど万が一のプロダクションでのクラッシュを避けるために assertionFailure & return してたパターン(このパターン自体に賛否はあるけど)、 async になったら値を返さないといけないので preconditionFailure にするしかない?インスタンス生成が簡単なら適当な値を返して握りつぶすことはできなくはないけど。
func foo(completion: @escaping (Foo) -> Void) { guard checkState(self.state) else { assertionFailure() return } ... }
(edited)
Avatar
t.ae 02-Jul-21 01:22 AM
このコードだとasyncにしても値を返す必要ないような…… completionに引数がないので
Avatar
tarunon 02-Jul-21 01:26 AM
asyncはvoid返り値でも関数作れるような?
普通にreturn書いたら良いと思います
Avatar t.ae
このコードだとasyncにしても値を返す必要ないような…… completionに引数がないので
Avatar
koher 02-Jul-21 01:31 AM
あ、逆だ。引数に Foo 入れないと。
修正しました。
Avatar
t.ae 02-Jul-21 01:33 AM
その場合はfoo() async -> Foo? にしてnilが返ってたらスルーとかにはできそうですね。 本来ありえないケースのためにOptionalにするのはちょっと微妙そうですが。
Avatar
Iceman 02-Jul-21 01:34 AM
今まではcompletionを呼ばないという裏技が使えたけど、asyncだと使えなくなったということですかね?
Avatar
tarunon 02-Jul-21 01:34 AM
裏ワザというか脱法行為に近い
Avatar Iceman
今まではcompletionを呼ばないという裏技が使えたけど、asyncだと使えなくなったということですかね?
Avatar
koher 02-Jul-21 01:34 AM
そうです。
エラーの握りつぶしだからよくないけど、本番でクラッシュよりはマシという判断があり得た。
Avatar
t.ae 02-Jul-21 01:35 AM
completeしてないからcompletionが呼ばれないのは自然という解釈も…
Avatar
kateinoigakukun 02-Jul-21 01:36 AM
completionを呼ばない場合っていうのは永遠にresumeしないwithContinuationで表現できると思います。まあ、その後ろのタスクが永遠に詰まっちゃいますが… (edited)
Avatar
tarunon 02-Jul-21 01:36 AM
今まではError返すべきのところをサボってただけなので
ちゃんとしたコードに治すべきだと思います
throwsに寄せるかOptionalに寄せるかは用途次第ですが
あとcompletionみたいに呼ばなくてもまあイイやみたいなのはasync関数だと表現が難しいので避けるべきデザインになると思いますね
死んだら帰らないからawait letで呼んでね!みたいなのは初見殺しすぎる (edited)
Avatar
niw 02-Jul-21 01:38 AM
脱法行為w
Avatar
tarunon 02-Jul-21 01:39 AM
「ObjectiveCでErrorポインタに2回書き込んでたらswiftブリッジで壊れるんだけど」 が同等の話題と思います
Avatar
niw 02-Jul-21 01:39 AM
どうせ crash するなら後は野となれ山となれだけど
assert とかだと死ねないんだなあ (edited)
ゾンビに。
Avatar
tarunon 02-Jul-21 01:41 AM
まあなんか、fatalErrorを詰めて任意のTを返す関数と同じように
withContinuationを呼んでTを返す終わらない関数は定義できる
Avatar
niw 02-Jul-21 01:42 AM
Facts
Avatar
tarunon 02-Jul-21 01:42 AM
while trueって打ったら出てきた
感覚的にはwhile trueがTに出来るみたいな感じ
Avatar
koher 02-Jul-21 01:55 AM
あー、前提としては事前条件の不正で Logic Failure だから preconditionFailure にするのが正しいんだけど、絶対にクラッシュさせたくないから assertionFailure にしておいて Release ビルドでは握りつぶしたいというテクニックを使っているケースの話ですね。まあ Optional にして呼び出し側で握りつぶす実装になるのかな。気持ち悪いけど。
Avatar
tarunon 02-Jul-21 01:56 AM
事前条件の不正が起き得ない箇所ならpreconditionFailureにするべきで、起き得るならthrowableにするべき、その間にはグラデーションは存在しないという立場です
保証できないならエラーを吐くべきかしら
Avatar
Kishikawa Katsumi 02-Jul-21 02:10 AM
私はthrowsにしますね。 でiOSアプリなら単純なクラッシュはメリットがないので、呼び出し元か簡単なものなら呼び出したところでクラッシュしない表現に変換して終わり。
Avatar
tarunon 02-Jul-21 02:12 AM
一応シチュエーションとしては、例えばデータベースに不正な値書き込まれるくらいならクラッシュした方がマシ、みたいなのは有り得る
Avatar
Kishikawa Katsumi 02-Jul-21 02:16 AM
そういう場合はありますね。
Avatar
omochimetaru 02-Jul-21 02:22 AM
CancelErrorが良さそう
Avatar
koher 02-Jul-21 02:41 AM
CancelError なるほど。
Avatar
omochimetaru 02-Jul-21 02:41 AM
まあthrowsにはなりますが。
Avatar
koher 02-Jul-21 02:43 AM
throws でいいケースなら↓は良さそうだな。
assertionFailure() throw CancellationError()
Avatar tarunon
事前条件の不正が起き得ない箇所ならpreconditionFailureにするべきで、起き得るならthrowableにするべき、その間にはグラデーションは存在しないという立場です
Avatar
koher 02-Jul-21 02:46 AM
事前条件の不正が起き得ない箇所なら
これは「 Logic Failure 以外でのエラーが起きなければ」という意味ですよね?それとも Logic Failure によって起こりうる場合も?
Avatar
tarunon 02-Jul-21 02:47 AM
LogicFailureが起きないことを保証するべきって話ですね 型で保証できない範囲はテストで保証するなり
Avatar
koher 02-Jul-21 03:06 AM
型で保証できない範囲はどこまでいってもグレーじゃないですか?
Avatar
tarunon 02-Jul-21 03:22 AM
例えばバンドルファイルからjson読み込んで〜みたいなシナリオだと、白に倒せると思うんですよね。しかもこのケースは失敗したら再起不能だ。
Avatar
koher 02-Jul-21 06:13 AM
そういうケースは僕もクラッシュでいいと思いますし、それをテストで防ごうとすることもできますが、テストは書き忘れることがあるし 100% ではないかなという意味でのグレーでした。多分判断基準自体は同じっぽいですね。 (edited)
Avatar
koher 04-Jul-21 01:28 AM
@swift-5.4.3
struct APIResponse<Value>: Decodable where Value: Decodable { var value: Value? var error: APIResponseError? func result() -> Result<Value, Error> { print("result") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (_, _): return .failure(APIResponseError(code: -1)) } } func result<Wrapped>() -> Result<Value, Error> where Value == Wrapped? { print("result optional") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (nil, nil): return .success(nil) case (_, _): return .failure(APIResponseError(code: -1)) } } } struct APIResponseError: Error, Decodable { var code: Int } struct User: Codable {} let r1: APIResponse<User> = .init(value: nil, error: nil) print(r1.result()) let r2: APIResponse<User?> = .init(value: nil, error: nil) print(r2.result())
Avatar
swift54 BOT 04-Jul-21 01:29 AM
result failure(main.APIResponseError(code: -1)) result failure(main.APIResponseError(code: -1))
Avatar
koher 04-Jul-21 01:29 AM
これって r2 の場合 "result optional" の方が優先度高くならないんですっけ?非ジェネリックとジェネリックだから?
Avatar
tarunon 04-Jul-21 02:49 AM
nilだと基本最外の.noneが優先されたと思います
Avatar
koher 04-Jul-21 02:50 AM
パターンマッチのところじゃなくてオーバーロードの解決のところですね。
result が表示されるか result optional が表示されるか。
Avatar
tarunon 04-Jul-21 03:14 AM
Type<A>.method<B>におけるoverloadの優先順位って、Bに関しては働くけどAに関しては特に働かなかった気がします
Avatar
koher 04-Jul-21 03:20 AM
なるほど。 Parameterized Extension が導入されればちゃんと選択されそうなんですけどねぇ。
みんな大好き @_disfavoredOverload の出番か・・・。
Avatar
tarunon 04-Jul-21 03:25 AM
優先順位、数字で付けたいんですよねぇ
アンスコ取れたらそうならないかな
Avatar
kateinoigakukun 04-Jul-21 03:36 AM
-debug-constraint みてみたんですが、スコア自体は両方同じで、constraintの数で勝敗が付いたっぽいですね
👀 1
Avatar
tarunon 04-Jul-21 04:11 AM
Optionalのprotocolを作って、extension APIResponse where Value: OptionalProtocol {...} にしたら優先順位として評価されるかも
Avatar tarunon
Optionalのprotocolを作って、extension APIResponse where Value: OptionalProtocol {...} にしたら優先順位として評価されるかも
Avatar
koher 04-Jul-21 02:34 PM
なるほど。
Avatar
koher 04-Jul-21 02:43 PM
@swift-5.4.3
protocol OptionalProtocol: ExpressibleByNilLiteral { associatedtype Wrapped static func some(_ value: Wrapped) -> Self static var none: Self { get } } extension OptionalProtocol { init(nilLiteral: Void) { self = .none } } extension Optional: OptionalProtocol {} struct APIResponse<Value>: Decodable where Value: Decodable { var value: Value? var error: APIResponseError? } extension APIResponse { func result() -> Result<Value, Error> { print("result") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (_, _): return .failure(APIResponseError(code: -1)) } } } extension APIResponse where Value: OptionalProtocol { func result() -> Result<Value, Error> { print("result optional") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (nil, nil): return .success(nil) case (_, _): return .failure(APIResponseError(code: -1)) } } } struct APIResponseError: Error, Decodable { var code: Int } struct User: Codable {} let r1: APIResponse<User> = .init(value: nil, error: nil) print(r1.result()) let r2: APIResponse<User?> = .init(value: nil, error: nil) print(r2.result())
Avatar
swift54 BOT 04-Jul-21 02:43 PM
result failure(main.APIResponseError(code: -1)) result optional success(nil)
Avatar
koher 04-Jul-21 02:44 PM
いけた。
Avatar
Kishikawa Katsumi 06-Jul-21 02:39 AM
https://swift-ast-explorer.com/ と 前に書いたコード補完用のSouceKit-LSPのWebアプリをCloud Runに移行した。 https://discord.com/channels/291054398077927425/375206337937801216/856351027774881802 固定費の削減、になるかはまだわからないけどVMインスタンスをメンテナンスしなくていいのはやはりすごい楽だ。
Swift AST Explorer - AST visualizer for Swift source code
👏 1
Avatar
omochimetaru 08-Jul-21 04:45 AM
self を shadow しても 暗黙の self は shadow されないのむずい
Avatar
koher 16-Jul-21 05:32 AM
@swift-5.4.3
import Foundation print(atan2(1.0, 0.0))
Avatar
swift54 BOT 16-Jul-21 05:32 AM
1.5707963267948966
Avatar
koher 16-Jul-21 05:32 AM
@swift-5.4.3
import Foundation print(atan2(1, 0))
Avatar
swift54 BOT 16-Jul-21 05:32 AM
exit status: 1 with stderr:
<stdin>:2:7: error: ambiguous use of 'atan2' print(atan2(1, 0)) ^ Foundation.atan2:1:13: note: found this candidate public func atan2(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat ^ Glibc.atan2:1:13: note: found this candidate public func atan2(_ lhs: Float, _ rhs: Float) -> Float ^ Glibc.atan2:1:13: note: found this candidate public func atan2(_ lhs: Float80, _ rhs: Float80) -> Float80 ^ SwiftGlibc.atan2:1:13: note: found this candidate public func atan2(_ __y: Double, _ __x: Double) -> Double ^
Avatar
koher 16-Jul-21 05:33 AM
1.0 なら ExpressibleByFloatLiteral の優先順位で Double が優先されるけど、 1 だと他の浮動小数点数に対して Double が優先されずに ambiguous になるっぽい。
Avatar
omochimetaru 16-Jul-21 06:27 AM
ですね!
リテラル型の推論があって 1f とかやらなくていいSwiftでも .0 を明示的に書く意味はちょっとある。 (edited)
Avatar
niw 18-Jul-21 04:15 AM
.0を書かない人多い…
Avatar
Kishikawa Katsumi 19-Jul-21 08:30 AM
https://swiftfiddle.com/ をGKEに移した。安いインスタンスが使えるからたぶん固定費の削減になるはず。 ただそれよりもVMを維持しなくて良くなったのと待機リソースの無駄がなくなるのがいい。 Kubernetesはめっちゃ難しかった。でもk8sの仕組み作った人は本当にすごいね。
Avatar Kishikawa Katsumi
https://swiftfiddle.com/ をGKEに移した。安いインスタンスが使えるからたぶん固定費の削減になるはず。 ただそれよりもVMを維持しなくて良くなったのと待機リソースの無駄がなくなるのがいい。 Kubernetesはめっちゃ難しかった。でもk8sの仕組み作った人は本当にすごいね。
Avatar
koher 19-Jul-21 09:00 AM
Playgroundはプログラミング言語を学ぶ上で非常に役に立つツールです。SwiftはXcodeとiPad・Macアプリとして動くとても高品質なPlaygroundを提供しています。公式のSwift Playgroundsはプログラムをインタラクティブに実行し、結果を途中経過も含めてわかりやすく表示してくれます。 Swift以外の言語に目を向けると、最近のプログラミング言語はどれもPlaygroundのような仕組みを提供しています。しかもほとんどのプログラミング言語にはWebで動作するPlaygroundが提供されています。 Webで動くPlaygroundはさらに強力です。Xcodeやアプリをダウンロードすることなく使え、頭に浮かんだことをiPhoneでサッと書いて実行すること...
毎年のように岸川さんと枠がかぶってるので今年はかぶらなきゃいいですが・・・。 (edited)
Avatar
Kishikawa Katsumi 19-Jul-21 09:02 AM
^ これは原稿なので原稿に書きますが、 k8sの話はない予定です。k8sの話になってしまうので。
Avatar
koher 19-Jul-21 09:03 AM
あれ?これ原稿だったのか。
Avatar
Kishikawa Katsumi 20-Jul-21 05:56 PM
GCPの料金推移
CloudFlareのアクセス解析
アクセスは増えてるけど料金はめっちゃ下がってる、
と考えていいのかな。クラウド初心者だからよくわかってない
Avatar
niw 20-Jul-21 05:57 PM
7/21にはまだなってないのでは?
7/20, 21は反映されていなさそう
Avatar
Kishikawa Katsumi 20-Jul-21 05:58 PM
あー、そういうことなんですね。日本時間で考えたらダメ、みたいな?
Avatar
niw 20-Jul-21 05:58 PM
たぶんJSTではないでしょうねえ
Avatar
Kishikawa Katsumi 20-Jul-21 05:59 PM
確かによくみたら一番右は9AMって書いてありますね。CloudFlare
Avatar
niw 20-Jul-21 06:41 PM
UTCベースなんでしょうね。
Avatar
Kishikawa Katsumi 20-Jul-21 06:58 PM
ひとまずトータルのスペックは余裕みて作ったけど安いインスタンスが使えてるのかコストが増えることはたぶんなさそうなのかな??
いや、昨日のぶんが記録されないとわかんないか。
Avatar
Kishikawa Katsumi 01-Aug-21 11:55 AM
クラウド費用のデータ、だいぶわかった。
最初のツノの部分がだいたいGKEに切り替えたところで結局のところ費用の面ではスケールアップでがんばってたときと変わらない。 スケールアウトできるようになったこととそこがある程度Googleに任せられること、サービスごとにデプロイできるようになったこととか要するに費用以外のGKEに変えたこととマイクロサービスで運用するようになったことのメリットが残る感じかな。
Avatar
Kishikawa Katsumi 02-Aug-21 03:43 PM
GCPのリソース割り当ての上限にすぐひっかかるのが難しいな。 割り当てのうちBackend servicesだけ全然あげてくれなくて問い合わせたりいろいろしないといけないっぽい。
Avatar
niw 02-Aug-21 03:44 PM
$500…
Avatar
Kishikawa Katsumi 02-Aug-21 04:10 PM
クラスタを構成するVMの数がいつの間にか3から2に減ってるしちょっとずつ安くなっていけばいいなあ、と楽観視しています。 あと割り当ての上限回避のためにほぼ使われないであろう古いバージョンの実行を1つのコンテナにまとめたりしました。
Avatar
Kishikawa Katsumi 04-Aug-21 02:38 PM
割り当て、セールスへコンタクトしたところ法人じゃなければダメとのことでしょうがないから少しずつ増やす方針に変えたらちょっとだけ増やせた。
Avatar Kishikawa Katsumi
クラウド費用のデータ、だいぶわかった。
Avatar
koher 05-Aug-21 01:42 AM
Swift Playgrounds 、どれくらいのアクセスがあってこの値段になるんですか?
Avatar
Kishikawa Katsumi 05-Aug-21 01:48 AM
CloudFlareの情報しかないけどこんな感じです。
Avatar
koher 05-Aug-21 01:51 AM
なるほど。月25万リクエストということは平均10秒に1回のリクエストくらいでしょうか?
それで$500はけっこうしますね・・・。
Avatar
Kishikawa Katsumi 05-Aug-21 02:12 AM
GKEにしたのはちょっと失敗かもしれないんですよねえ。まだよくわかってないから、というのもあるんですけどイマイチ安定しないし。。。
Avatar
koher 05-Aug-21 02:19 AM
前に試したときは、Compute Engineの安めのインスタンス(下から2番目とか)でも、 Nginx + Node(Express) + Docker で Swift のソースコードをリクエストで受け付けて実行して結果を返すところまでクライアントサイドから見て 1 秒くらいで捌けてたんで、単純に実行するだけなら 10 秒に 1 回のリクエストならそれくらいでも十分できそうな気がします。ただ、多分コードの保存とか色々やってるんですよね?
Avatar
Kishikawa Katsumi 05-Aug-21 02:22 AM
コードの保存はFireStoreなんですけど、実際の負荷はどうなのかなあ。1つのVMでがんばってたときはGoogleからの提案でどんどんスペックアップしていったのでそろそろスケールアウトかなあと思ったんですよね。
Avatar
niw 05-Aug-21 02:26 AM
そもそもどんな構成になってるのかわからないと難しい
Avatar
koher 05-Aug-21 02:45 AM
コードの保存はFireStoreなんですけど
これはクライアントサイドですか?それともサーバーサイドから Admin SDK で?
Avatar
Kishikawa Katsumi 05-Aug-21 02:48 AM
クライアントが現在のコードをPOSTしてそこからはサーバーサイドでFireStoreのAPIを使います。サーバーサイドSwiftはAdmin SDKがないのでREST APIです。
Webフロントエンドとコードをコンパイルして実行するランナーがいて、ランナーはSwiftのバージョンごとにいます。
(リソース割り当ての上限があるので古いバージョンはまとめている)
それをIngress(L7ロードバランサ)で
- http: paths: - backend: serviceName: runner-vnightly-main servicePort: 80 path: /runner/nightly-main/* pathType: ImplementationSpecific - backend: serviceName: runner-vnightly-55 servicePort: 80 path: /runner/nightly-55/* pathType: ImplementationSpecific - backend: serviceName: runner-vnightly-54 servicePort: 80 path: /runner/nightly-54/* pathType: ImplementationSpecific - backend: serviceName: runner-vnightly-53 servicePort: 80 path: /runner/nightly-53/* pathType: ImplementationSpecific - backend: serviceName: runner-v542 servicePort: 80 path: /runner/5.4.2/* pathType: ImplementationSpecific - backend: serviceName: runner-v541 servicePort: 80 path: /runner/5.4.1/*
こんなルーティングで振り分けています。
でマイクロサービス群をGKEのクラスタにデプロイしています。 (edited)
Podsは2つで、CPU4のメモリ16GBだったかな?
Avatar
koher 05-Aug-21 03:10 AM
クライアントが現在のコードをPOSTしてそこからはサーバーサイドでFireStoreのAPIを使います。
Firestore への書き込みをクライアントサイドに持っていくなど、サーバーサイドは本当にコードを受け取って実行して結果を返すだけにすれば処理負荷が大分軽くなったりしないでしょうか? SSR とかもやってるんですっけ?
ランナーはSwiftのバージョンごとにいます。
あー、これ大変そうですね・・・。
まあでもリクエストの総数が増えるわけじゃないから、(Dockerイメージ分だけ肥大化するけど)捌けないわけじゃないかなぁ。
Avatar
Kishikawa Katsumi 05-Aug-21 03:15 AM
FireStoreへのリクエストはShareのボタンを押したときだけだけなので(測ってないけど)おそらく影響は少ないと思います。 SSRはシェアされたコードの復元のために最初にエディタに入ってるコードをテンプレートで置換していますね。それがない場合は初期表示は毎回同じです。
Avatar
Iceman 05-Aug-21 03:17 AM
1つのVMで頑張ってた時代があったということは、1つのVMで複数Swiftバージョン切り分けれるということですよね?
どのバージョンでも動かせれるインスタンスを複数台用意するほうが綺麗そうだなとは思いました
Avatar
Kishikawa Katsumi 05-Aug-21 03:21 AM
確かに実行は5.4.2に集中するからそのほうが合理的かも。
デプロイが大変なんですよね。1つが巨大になると。 まあ大きいけどやってることは各種バージョンのDockerイメージをPullするだけだから簡単にできるか。
Avatar
Iceman 05-Aug-21 03:24 AM
なるほど1つあたりのイメージが巨大になるですね
コンテナの中でさらにSwiftバージョン別のコンテナを起動してもいいけど、自前でコンテナ実行環境世話しないといけなくてディスクパンクとかトラブりそうでそれはそれで面倒そうだ
Avatar
Kishikawa Katsumi 05-Aug-21 03:31 AM
コンテナの中でコンテナを起動しています。が、Docker outside of Dockerなので並列にWebフロントエンドと各種ランタイムバージョンのSwiftイメージ(コンテナ)がいる、という構成ですね。旧バージョンは。
services: app: image: kishikawakatsumi/swift-playground:latest ... carbonara: image: petersolopov/carbonara ... nginx-proxy: image: nginxproxy/nginx-proxy ... acme-companion: image: nginxproxy/acme-companion ... swift-nightly-main: image: swiftlang/swift:nightly-main container_name: swift-nightly-main swift-nightly-5.5: image: swiftlang/swift:nightly-5.5 container_name: swift-nightly-5.5 swift-nightly-5.4: image: swiftlang/swift:nightly-5.4 container_name: swift-nightly-5.4 swift-nightly-5.3: image: swiftlang/swift:nightly-5.3 container_name: swift-nightly-5.3 swift-5.4.1: image: kishikawakatsumi/swift:5.4.1 container_name: swift-5.4.1 swift-5.4: image: kishikawakatsumi/swift:5.4 container_name: swift-5.4 ...
こんなdocker-compose.ymlでした。
(edited)
VMの面倒を見ればいいんだけど、こういう構成をパッと使い捨てでデプロイできるのはk8sしかない感じがあります。
それもGKEに移行した理由かな。
docker-composeで頑張るのがなかなかしんどい。
Avatar
Iceman 05-Aug-21 03:39 AM
ああなるほど。元々docker-composeで1つのVMに横並びにいたインスタンス郡をk8sに展開した形にしたけど、そしたらGCPのリソース制限にかかったと。
Avatar
Kishikawa Katsumi 05-Aug-21 03:47 AM
クラスタを作ったりサービスをデプロイすると関連するリソースが自動的に作られるんですよね。IPアドレスやエンドポイント、バックエンドサービス(よくわからない)など。 で、最初のリソース割り当てはかなり少ないから何か操作をするたびになんらかのリソース上限にかかる。 まあそれはだいたい簡単にあげてもらえるからやり直したらいいんだけど私の場合はバックエンドサービスが全然初期値から上がらなくて難しかった(今は少し上がった)
Avatar
Iceman 05-Aug-21 03:50 AM
ですね。サービス間の接続が自動で行われるのでとても相性がいいと思いました
Avatar
Kishikawa Katsumi 05-Aug-21 03:50 AM
リソース効率はアイスマンさんの言ってる構成の方が良さそう。 ソフトウェア的にはSwiftの各バージョンのランナーはベースイメージとちょっとエントリーポイントのパラメータを変えただけで同じものをデプロイできるから楽。いや、全部入りでもそんなにコードは変わらないんだけど。
Avatar
Iceman 05-Aug-21 03:52 AM
リソース効率についてなんですが、ちょっと調べたらサービスがたくさんいようが結局はホストインスタンスに対するコストになるので、各サービスが呼び出されていなくて実質休眠しているのならすでに最適な状態なのではないかと思いました
常に各バージョンごとに最低1コンテナ起動していて、メモリだけ食ってる、とかならその分はかかってるかもしれないです (edited)
Avatar
Kishikawa Katsumi 05-Aug-21 03:57 AM
確かに論理的には存在するけど物理的な2つか3つのマシンに同居しているわけですもんね。 VMとコンテナの関係は1つのマシンにdocker-composeでコンテナを管理してたのと一緒なのかな。。。?
Avatar
koher 09-Aug-21 11:47 AM
前も書いた気がするけど extension private なアクセスレベルがほしい。ある private メソッドからだけ呼ばれるメソッド群(処理に名前を付けるだけ)が他のメソッドから可視なのが気持ち悪い。それらを extension にまとめた上で extension private にして、そのメソッドからだけ可視にしたい。
Avatar
Kishikawa Katsumi 11-Aug-21 01:22 AM
swift-format https://github.com/apple/swift-format をいろいろ試せるツール作った。 https://swift-format.com/
🎉 2
Avatar
niw 11-Aug-21 06:30 PM
カーソルがなぜかぴこぴこする...
Avatar
Kishikawa Katsumi 11-Aug-21 08:12 PM
そこは直しかたがまったくわからない。。。😥 Tooltipを出すためにボタンをspanで囲ってtooltipの情報を設定しているからその辺かなあ。。。
display-blockとかで直るかな。
Avatar
Kishikawa Katsumi 11-Aug-21 08:28 PM
外側と内側でTooltipとボタンの役割を入れ替えて多少マシになったと思います。 どうもありがとうございます。
まだ怪しいけど。
Avatar
niw 11-Aug-21 08:29 PM
Tooltip かも
したからcursorを合わせるとぴこぴこするのはそこにtooltipが出ようとして
自身のhoverイベントが消えてを繰り返してる感じ
上からcursorを合わせるぶんにはぴこぴこしない
tooltipにmouse hoverのイベントを食われないようにしないといけない感じ
Avatar
Kishikawa Katsumi 11-Aug-21 08:32 PM
本当ですね。上からなら問題ない。
Avatar
niw 11-Aug-21 08:33 PM
ボタン上にあるからカーソルはしたからくるのがほとんどなので、ぴこぴこしちゃう
Avatar
Kishikawa Katsumi 11-Aug-21 08:34 PM
ですよね。「?」ボタンも一緒の問題がありますね。。
Avatar
Kishikawa Katsumi 11-Aug-21 09:29 PM
カーソルは下から来るからTooltipを上か横に出したらさらにマシになるか。なんとなく下に出るのが自然な気がして下向きにしたけど
Avatar
niw 11-Aug-21 09:29 PM
上に出したら体感は減りそう
Avatar
Kishikawa Katsumi 11-Aug-21 10:10 PM
WebでTooltipをいい感じに出すっていうのはすごい高度な技術っぽいすね。
横にすると吹き出しの三角の位置が微妙におかしい😥
Avatar
niw 11-Aug-21 10:11 PM
厳しいw
tooltip ちゃんと出すのは iOS とかでも高度な技術だと思う
Avatar
Kishikawa Katsumi 11-Aug-21 10:35 PM
確かに。ビューの外側に出したりスクロールして画面外にいったとき(さらに戻ったとき)の挙動とか難しいですね。
data-bs-container っていうオプションを発見してそれでボタンを指定すれば安定するようになりました。
Avatar
niw 11-Aug-21 10:39 PM
bs...
bootstrap なのかあ。
あれ?設定でspace 3にしたのに3にならない
Runすると戻っちゃう感じが。
Avatar
Kishikawa Katsumi 11-Aug-21 10:46 PM
むむ、調べます。
Avatar
niw 11-Aug-21 10:46 PM
変えた直後は3でフォーマットされるんだけど、Runすると2になっちゃう感じ
Avatar
Kishikawa Katsumi 11-Aug-21 10:47 PM
Runボタンだけなんか違う処理通ってそうな感じですね。
直せそうです。見えてない状態の値が取れなくなる、だと思います。 innerTextで値を取ってたところがあって、それをtextContentに変えたら大丈夫そう。どうもありがとうございます。
👍 1
Avatar
Kishikawa Katsumi 12-Aug-21 02:59 AM
swift-formatはライブラリとして利用することもできて、最初はそうやってたんだけどCLIとしての利用が前提なのかいろんなところですぐfatalError()を呼んでるので結局コマンドラインから呼んでいるのであった。
そうしないとちょっと構文エラーのある入力を与えるだけでサーバプロセスごとfatalError()で死んでしまうので。。。
Avatar
Avatar
Kishikawa Katsumi 12-Aug-21 04:46 AM
おおお、こんなのがあったんですね。 プロセスを分離するようなことができる可能性があったのか。 サードパーティの行儀の悪いライブラリなんかも隔離して実行したいとかサーバーサイドじゃなくてもiOSアプリでもあるんですよねえ。 (edited)
Avatar
koher 12-Aug-21 10:25 AM
そうなんですよ。これ期待してたんですけどね・・・。 Erlang だとこれに近いのがあるみたいで、 Actor ごとのプロセスだけクラッシュさせられるので、 Actor をエラーハンドリングの単位として使うみたいなことを聞いたことがあります。 (edited)
Avatar
niw 12-Aug-21 03:34 PM
便利...
Avatar
Kishikawa Katsumi 12-Aug-21 04:10 PM
Swift 7あたりで入ってこないかな?
Avatar
koher 13-Aug-21 06:42 AM
ただ、今の actor を考えると、 Fault Isolation の単位が actor であるべきかは微妙な気がするんですよね。別の仕組みとして入った方が使い勝手が良さそうな。 Erlang みたいに何でも Actor でやる言語ならともかく。 (edited)
Avatar
tarunon 13-Aug-21 07:22 AM
子プロセス作るのをactorとして抽象化できるなら、アリだなという感じがしますね
Avatar
omochimetaru 13-Aug-21 07:23 AM
Distributed Actorも
相手先のfatalErrorはこっちがわに伝搬しなそう
Avatar
koher 13-Aug-21 08:56 AM
子プロセス作るのをactorとして抽象化できるなら
Erlang のプロセスは OS のプロセスとはまた別なんですよね。 Swift だと何が近いんだろ? Task かな?
Task ごとに Fault Isolation があるといいかも?
Avatar
omochimetaru 23-Aug-21 07:04 AM
protocolの extension で書く init の中だと self.initSelf.init の両方がほぼ同じ意味で書けるけど、意味が違うことを今日知った (edited)
extension CodableFromLosslessStringConvertible { public init(from decoder: Decoder) throws { let c = try decoder.singleValueContainer() let string = try c.decode(String.self) // ここが self.init だと怒られる guard let value = Self.init(string) else { throw DecodingError.dataCorruptedError( in: c, debugDescription: "invalid string: \(string)" ) } self = value } }
(edited)
Avatar
koher 23-Aug-21 07:12 AM
self.init は戻り値がないからかな?
Avatar
omochimetaru 23-Aug-21 07:13 AM
Avatar
koher 23-Aug-21 07:13 AM
なるほど。
Avatar
omochimetaru 23-Aug-21 07:13 AM
そうですね。 self.init は 別のinitへの転送という意味なので。 しかもこの場合、throwsなinitから optional なinitを呼んでてそこの不一致もある。
Avatar
tarunon 23-Aug-21 07:14 AM
classでself.init呼ぶ場合はconvenience initにしないといけないんじゃなかったっけ
Avatar
omochimetaru 23-Aug-21 07:14 AM
そうだね。
Avatar
tarunon 23-Aug-21 07:14 AM
あとOptionalとfailureableは結構制約がある
Avatar
omochimetaru 23-Aug-21 07:15 AM
細かい規則がいろいろあって結構むずいよね。
Avatar
koher 23-Aug-21 07:15 AM
クラスの init むずい。
クラスの継承ってほとんど使わないし、継承使いがちな UIView とか UIViewController はパターン決まってるし、たまにクラスを継承して init 書くことあると戸惑う。 (edited)
Avatar
omochimetaru 23-Aug-21 07:24 AM
クラスのinitはrequired init もありますからね。
Avatar
koher 23-Aug-21 07:42 AM
designated, required, convenience, override 😂
😵‍💫 1
Avatar
omochimetaru 25-Aug-21 03:44 AM
😵‍💫 1
Avatar
tarunon 25-Aug-21 03:45 AM
NSErrorに化けるヤツかな
Avatar
omochimetaru 25-Aug-21 03:45 AM
switch + is と if + as のとき、always succeeds って警告出すけど、実行してみると、失敗していて、警告が嘘。 (edited)
Avatar
tarunon 25-Aug-21 03:46 AM
ErrorとNSErrorの暗黙変換が悪さをしていて、diagnoseが壊れているのだと思います
Avatar
omochimetaru 25-Aug-21 03:46 AM
これ長期的にどっちが正になるかわからんので怖いな。
一応実挙動が維持されると思っていいか。
Avatar
tarunon 25-Aug-21 03:47 AM
NSErrorのせいでErrorを直で使うのは危ないので
1層包むジェネリックなErrorを作ってその中に任意の構造を入れると安全になる
Avatar
omochimetaru 25-Aug-21 03:48 AM
error as Any as? CustomStringConvertible で警告は消せた。 (edited)
Avatar
tarunon 25-Aug-21 03:50 AM
関連するバグを3.1の時に報告したけど未解決のままだな、今どうなってるんだろ https://bugs.swift.org/browse/SR-4414?filter=-2
実際このときはalways trueになってたんだよね。だからおもちさんのそのコードも全部警告通りになってた
Avatar
omochimetaru 25-Aug-21 03:52 AM
マジか。挙動変わってるのか。 (edited)
Avatar
tarunon 25-Aug-21 03:52 AM
だから今は治ってるのかな。まああんまり信頼できないんで1層ラップするのが良いと思うよ
Avatar
omochimetaru 25-Aug-21 03:52 AM
いや、ルートのログレポートのロジックだから、Swift.Error で受けたいんだよね
Avatar
tarunon 25-Aug-21 03:52 AM
それは難しいなぁ
"\(err)"にして薙ぎ払うとか?w (edited)
Avatar
omochimetaru 25-Aug-21 03:54 AM
それは、CustomStringConvertible すら取れなかったときの最後の手段になってる
swift-log を使うと、 Logger.Metadata ってのがあって
なるべく構造を保ってログシステムに流そうとしている
Avatar
tarunon 25-Aug-21 03:55 AM
ふむー
Avatar
koher 30-Aug-21 09:10 PM
https://discord.com/channels/291054398077927425/306995750418513920/882003927468486707 で話してて、↓みたいな run 関数が標準ライブラリにあるとうれしい気がしてきた。
func run<T>(_ body: () -> T) -> T { body() }
よくあるプロパティの初期化が
var foo: Foo = { ... return Foo(...) }()
みたいなのも
var foo: Foo = run { ... return Foo(...) }
と書ける。 () でクロージャ式即実行の気持ち悪さが緩和されそう。 非同期版の
func run<T>(_ body: () async -> T) async -> T { await body() }
もあれば、 MainActor に戻す処理も
await { @MainActor in self.foo = foo }()
じゃなくて
await run { @MainActor in self.foo = foo }
と書ける。
Avatar
shiz 30-Aug-21 11:49 PM
MainActorの場合はMainActor.runが使えないですかね?(すいません何か勘違いしてるかもしれないです) https://github.com/apple/swift/blob/main/stdlib/public/Concurrency/MainActor.swift#L46 (edited)
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar shiz
MainActorの場合はMainActor.runが使えないですかね?(すいません何か勘違いしてるかもしれないです) https://github.com/apple/swift/blob/main/stdlib/public/Concurrency/MainActor.swift#L46 (edited)
Avatar
koher 31-Aug-21 02:07 AM
ありがとうございます!何か手段があった気がしてたんですが、これかもしれないです。 MainActor に戻す手段をどこかで見たなぁと思って WWDC のセッションや Proposal 漁ってたんですが、 { @MainActor in ... } を見つけて、これだったかも?ってなってました。
↓の T.self をデフォルトにするのおもしろいですね。 JSONDecoder.decode とかもこれやってほしいかも。
static func run<T>(resultType: T.Type = T.self, body: @MainActor @Sendable () throws -> T) async rethrows -> T
@swift-5.4.3
import Foundation extension JSONDecoder { func myDecode<T: Decodable>(_ type: T.Type = T.self, from data: Data) throws -> T { try decode(type, from: data) } } let decoded: [Int] = try! JSONDecoder().myDecode(from: "[2, 3, 5]".data(using: .utf8)!) print(decoded)
Avatar
swift54 BOT 31-Aug-21 02:12 AM
[2, 3, 5]
Avatar
omochimetaru 31-Aug-21 03:32 AM
↓の T.self をデフォルトにするのおもしろいですね。 JSONDecoder.decode とかもこれやってほしいかも。
↑これは当時仕様設計時に議論されて棄却されてました
(edited)
Avatar
koher 31-Aug-21 03:37 AM
えー、 MainActor.run でいいのはなぜ?用途が異なるから?
Avatar omochimetaru
↓の T.self をデフォルトにするのおもしろいですね。 JSONDecoder.decode とかもこれやってほしいかも。
↑これは当時仕様設計時に議論されて棄却されてました
(edited)
Avatar
koher 31-Aug-21 03:37 AM
第一引数をなくすのではなく、デフォルト引数を与えるのも棄却されてたの?
Avatar
omochimetaru 31-Aug-21 03:38 AM
その run はそもそも resultType がない場合は withXxx 系で多用されるパターンですよね
だから、無いのが自然で、そこに追加的にresultTypeが足されてるって感じに見えます
Avatar
koher 31-Aug-21 03:39 AM
なるほど。
Avatar
omochimetaru 31-Aug-21 03:39 AM
https://github.com/apple/swift-evolution/blob/main/proposals/0167-swift-encoders.md 昔のだからなのか、Alternative Considered章がないな・・・
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/0167-swift-encoders.md at main · apple/swift-evolution
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/0166-swift-archival-serialization.md at main · apple/swift-evolution
0166もあるのか。こっちはAltC書いてあるけど、型の件はないな
Avatar
Iceman 31-Aug-21 03:42 AM
左辺から逆向きに型をひっぱるの、型推論の気分次第で事故ることがあるので明示的なほうが好ましいと思います
Avatar
koher 31-Aug-21 03:44 AM
明示できるようにした上で、デフォルトで省略はありなのかなぁと思ったけどダメかなぁ。
Avatar Iceman
左辺から逆向きに型をひっぱるの、型推論の気分次第で事故ることがあるので明示的なほうが好ましいと思います
Avatar
omochimetaru 31-Aug-21 03:45 AM
そんな話があって当時、そうだなあと納得したんだけど、検索してもみつからね〜
Avatar koher
明示できるようにした上で、デフォルトで省略はありなのかなぁと思ったけどダメかなぁ。
Avatar
omochimetaru 31-Aug-21 03:45 AM
ちなみに推論に任せる場合の悩ましさとして、 右辺値から左辺値に代入する過程で生じうる暗黙の型変換が存在するので、そういう怖さはありますね
例えば、左辺が Int? だった場合に、右辺が Int で推論されるのか Int? で推論されるのかが、 decode の場合は重い違いになってきます。
代入文の右辺値・左辺値間もそうだし、関数呼び出し時の 実引数・仮引数間にも変換が生じます(しかもこっちは関数呼び出し用の謎変換が候補に追加される)
Avatar
koher 31-Aug-21 03:51 AM
暗黙型変換は辛い・・・。
Avatar
omochimetaru 31-Aug-21 03:51 AM
First of all, great proposal 😃 Brent, earlier in the thread makes a lot of good points. But I’d still like to discuss two subjects: 1) What makes the proposal really stand on its feet compared to third-party libraries is the compiler generation magic. I feel divided about it. On one hand, this is the only solution today to have this level of t...
2) Libraries like Marshal (https://github.com/utahiosmac/Marshal) and Unbox (https://github.com/JohnSundell/Unbox) don’t require the decoding functions to provide the type: those functions are generic on the return turn and it’s automatically inferred:
>
func decode<T>(key: Key) -> T
>
self.stringProperty = decode(key: .stringProperty) // correct specialisation of the generic function chosen by the compiler
>
Is there a reason the proposal did not choose this solution? Its quite sweet.
↑ご意見は見つかった
Avatar
koher 31-Aug-21 03:53 AM
これは第一引数をなくしてしまう話じゃない?
なくすのはないと思っていて、デフォルトで T.self が与えられてるのはありかなぁと。
Avatar
omochimetaru 31-Aug-21 03:54 AM
もしかして当時ってまだ protocol extension が無いからデフォルト引数が定義できなかった? (edited)
Avatar
koher 31-Aug-21 03:55 AM
JSONDecoder は具象型だから関係なくない? (edited)
Avatar
omochimetaru 31-Aug-21 03:56 AM
JSONDecoder.decode はたしかに。 KeyedContainerProtocol.decode(:for) の話かと思ってました。そっちのほうがたくさん書くのが大変だし。
https://forums.swift.org/t/proposal-foundation-swift-archival-serialization/5456/35
If each `KeyPath` encapsulates the type information, the `decode` methods won't need a `type` parameter.
>>51 で matthewさんもこの話してるな
Avatar
koher 31-Aug-21 03:59 AM
たしかに JSONDecoder だけの話じゃないか。
Avatar
omochimetaru 31-Aug-21 04:00 AM
ちょいちょい話題が出てくるのでもうちょっと進んだら反論が出てくるのかな
うーんザッと見じゃわからんかった
ML時代のやつで検索やハイパーリンクが弱いし、announcementの投稿も形式化されてなかったっぽいのでまとめ投稿が見つからん
Avatar
koher 31-Aug-21 04:03 AM
ML時代辛い・・・
Avatar
omochimetaru 31-Aug-21 04:05 AM
There is probably some reason I don't understand that all of them require a metatype argument. Can we just give them all a default (i.e. making the beginning of the signatures look like this)? func decode(_ type: Decodable.Type = Decodable.self The .selfs are not helpful. Not having them is better. struct Coatable: Codable { let 🥼: Int l...
最近になって聞いてる人がいるけど微妙な回答で終わってるな
Avatar omochimetaru
そんな話があって当時、そうだなあと納得したんだけど、検索してもみつからね〜
Avatar
Iceman 31-Aug-21 04:08 AM
class UICell {} func _dequeue(_ type: UICell.Type) -> UICell { print(type) // MyCellが出てこない fatalError() } func dequeue<Cell: UICell>(_ type: UICell.Type = Cell.self) -> Cell { _dequeue(Cell.self) as! Cell } class MyCell: UICell {} class MyCell2: UICell {} func cell(for row: Int) -> UICell { let cell: UICell if Bool.random() { cell = dequeue(MyCell.self) } else { cell = dequeue(MyCell2.self) } return cell } cell(for: 0)
おぼろげな記憶から思い出してみたんですがこんな感じだったかも?
Avatar
omochimetaru 31-Aug-21 04:10 AM
@Iceman その場合は↓が正しいコードじゃない?
func dequeue<Cell: UICell>(_ type: UICell.Type = Cell.self) -> Cell { _dequeue(type) as! Cell }
(edited)
Avatar
Iceman 31-Aug-21 04:10 AM
そうですね。
たいていのケースでうまくいってたのでミスの発見が遅れたパターンです (edited)
Avatar
omochimetaru 31-Aug-21 04:11 AM
ああなるほど。まあ、実装ミスに関しては、標準ライブラリ仕様に関しては関係ないんじゃないでしょうか
Avatar
Iceman 31-Aug-21 04:13 AM
もうちょっと複雑だった気もするんですが、とりあえずミスってたときに気づきづらいなと
Avatar
omochimetaru 31-Aug-21 04:13 AM
まあそれはありますね。間違った推論が伝搬して予想外のところでエラーが出たりする。
Avatar
Kishikawa Katsumi 09-Sep-21 06:12 PM
前に書いたサーバー費用、支払いのチャートの詳しい見方がようやくわかって、ボトルネックはLSPのAPIを動かしてるサーバで、それをCloud Runで動かしていたのだけどLSPはかなりCPUを使ってるみたいで「使ったぶんだけ」の料金体系だと想像以上に費用がかさむようでした。 LSPをK8Sの方にうつしたらちょっと安定性は悪くなったんだけど(そこそこの頻度でリソース不足で止まる)費用は半分くらいになった。
LSPはそこそこスペックが必要だなあというのはわかってたんだけどまさか実際にビルドして実行するよりもはるかにスペックを要求するとは考えの外だった。
メモリは最低で1GB使ってきます。1GB使えないマシンだとLSPは全然動かない。でもGCPの料金計算だと、それよりも大量にCPUを使ってるみたい。 (edited)
Avatar
koher 09-Sep-21 06:22 PM
ビルドはボタン押したときだけだけど、LSPはコード書いてる間中動いているからでしょうか?
Avatar
Kishikawa Katsumi 09-Sep-21 06:34 PM
詳細な要因まではわかってないです。。。
トラッキング等も全然入れてないので(エラーログを送ってるくらい)実際にどういう使われ方をしているかは想像でしかないんですけど、、、 SourceKit-LSPの挙動を見る限りはタイプしているかカーソルをホバーしているか、という以外で無駄に動いてる様子はないので、補完とか型を表示するとかが重たいのかなあと。 (edited)
Avatar
Kishikawa Katsumi 11-Sep-21 08:14 PM
Azureの方がGoogleより安いから移行して、さらに3年分のリソースをまとめて買う割引で15,000円/月くらいになった。 GoogleのManagedサービスがAzureにはほとんどないからその分を作る必要があったけどなんとかなった。 (edited)
✍️ 1
Avatar
dictav 13-Sep-21 05:42 AM
CloudRun だとリクエストの数やCPU負荷に応じて複数のインスタンスが立ち上がってしまうと思います。 インスタンス数を制限すればある程度料金は抑えられたかなと思います。 (すでにやってたらすみません)
Avatar
Kishikawa Katsumi 13-Sep-21 06:55 AM
制限すると一定以上の負荷はエラーにするってことですよね?
Avatar
dictav 13-Sep-21 07:33 AM
はい、その通りです。
あと、もしからしたら不必要にスケールしちゃってたかなと思いまして。
Avatar
Kishikawa Katsumi 13-Sep-21 07:55 AM
最大までスケールするのは問題なかったんですけど、読み間違えましたね。VMが無駄に待機していると思ってたんですけどLSPに関しては使っただけ料金を払う方がだいぶ高かった、というのが誤算というか気付くのが遅れました。
👀 1
負荷が来たときにエラーにするのは小さいVMを確保するのと変わらないのでそれは避けたかったんですよね。
スケールするのは構わないけど無駄なリソースを待機させたくはない、、、でCloud Runか?と思って他のサービスはそれでよかったんですけどLSPは誤算でした。
Avatar
dictav 14-Sep-21 04:45 AM
なるほど。ありがとうございます。 使わない時間が多ければ CloudRun でもかなり安くなると思ったのですが、LSPのような高負荷なプログラムだと難しいようですね
Avatar
tarunon 14-Sep-21 05:09 AM
LSPもそうですけど、起動コストが重たいサービスは常駐させるしかないのが辛いところですよね
Avatar
omochimetaru 14-Sep-21 05:19 AM
GitHub Codespacesは計算課金になってるの最近気づいて なるほどと思った
Avatar
dictav 14-Sep-21 05:58 AM
ちょうどこんな発表がありました。本件では安くはできないとは思いますが。 https://cloud.google.com/blog/products/serverless/cloud-run-gets-always-on-cpu-allocation (edited)
New always-on CPU allocation for Cloud Run opens the doors to running workloads that use background processes.
Avatar
Kishikawa Katsumi 14-Sep-21 07:24 AM
Cloud Runどんどん便利になっていくな。 私の場合VMの面倒をみたくない、というのが一番大きい感じなので(GoogleだとAPIでセットアップから自動化できるけどCloud RunやKubernetesに比べるとやっぱり面倒さがある)Cloud Runがどんどん便利になるといいのかなあ。 Cloud Runだとちょっと難しい、、、っていう場面を解決したい場合、次はKubernetesみたいなだいぶ大がかりな仕組みになってしまう、のでいい感じのCloud Runよりちょっと上のManagedコンテナのサービスがあるといいなあと思っている。 (edited)
Avatar
tarunon 14-Sep-21 07:39 AM
awsだとecsがあるんですよね。かなり楽。
Avatar
t.ae 14-Sep-21 07:51 AM
AWSだと少し前に出たこれがCloud Runっぽいとか? https://aws.amazon.com/jp/blogs/news/introducing-aws-app-runner/
この記事は Introducing AWS App Runner を翻訳したものです。 本日、 AWS 上でコンテナ化された Web アプリケーションをビルド、および実行するための最も簡単な方法である、 AWS App Runner を発表できることを嬉しく思います。 App Runner はコンテナネイティブのフルマネージドサービスです。オーケストレーターの設定、ビルドパイプラインの準備、ロードバランサーの調整、 TLS 証明書のローテートなどは必要ありません。そしてもちろん、管理すべきサーバもありません。 App Runner はアプリケーション実行時間に対する秒単位での課金と、セキュアなプロダクションワークロードを実行するために必要な全てを提供します。たった数クリックで、パブリッ...
Avatar
Kishikawa Katsumi 14-Sep-21 08:46 AM
AWSもこんど使ってみよう。ECSとApp Runnerはどう違うんだろ
Avatar
tarunon 14-Sep-21 08:48 AM
AppRunnerはパッと説明見た感じインフラまで全部セットな感じがしますね
Avatar
Kishikawa Katsumi 14-Sep-21 08:48 AM
あれ、ECSはEC2の管理が必要?
Avatar
tarunon 14-Sep-21 08:48 AM
Fargate使えば要らないです。
GPU欲しかったらEC2必須
Avatar
Kishikawa Katsumi 14-Sep-21 08:48 AM
なるほど。ここでFargateが出てくるのか。
Avatar
tarunon 14-Sep-21 08:48 AM
ecsは基本コンテナを動かすだけですね、インフラ周りは他で整えます (edited)
Avatar
Kishikawa Katsumi 14-Sep-21 08:49 AM
なるほどわかってきた。私の場合まずFargateをやってみるのがよさそう。
Avatar
tarunon 14-Sep-21 08:50 AM
AppRunner、雰囲気いつもecsの周辺を整えてるのが最初から全部入ってるって感じかな
Avatar
Kishikawa Katsumi 14-Sep-21 08:50 AM
FargateができたらECSもKubernetesもどっちもいけるんだな。
Avatar
tarunon 14-Sep-21 08:51 AM
どっちかというとECSとかEKSを動かすときに、マシンリソースがEC2 vs Fargateになってるって感じかな?
Avatar
Kishikawa Katsumi 14-Sep-21 08:55 AM
Fargateは説明を読むだけだと結局わからないな。 GoogleでいうとGKEのオートパイロットモードが近そうだけど。
AKSより先にFargateを試したほうが良かった気もするけどまあ別の何か作るのを考えよう。 (edited)
Avatar
Iceman 14-Sep-21 08:58 AM
AKSに紐付ける、実際にアプリケーションを動かすインスタンスがEC2かFargateという話なので、AKSを使うなら同時に触ることになりますね
Avatar
Kishikawa Katsumi 14-Sep-21 09:00 AM
変な質問になるけどFargateに対応するGoogleとAzureのサービスはないんですか?
Avatar
Iceman 14-Sep-21 09:01 AM
どうなんでしょう?基本的にFargateに該当するサービスはGoogleやAzureでは内部に隠蔽されてる気がします
AWSは最初はEC2のクラスタにECSを使ってコンテナをデプロイするって感じで、でもEC2クラスタ管理するのめんどくさいよねってことでFargateが後から生まれた感じだったと思います。Cloud RunとかAzureのAppServiceなんかはそのステップが最初からないので見えてないか、あるいはDedicated Instanceみたいな文脈で指定する方法があるのかも
Avatar
Kishikawa Katsumi 14-Sep-21 09:06 AM
そうなんですね。GとMに比べてFargateはすごく楽そうに見える。GKEでいうとたぶんオートパイロットはかなり運用面では近いものになりそう。 Azureはその辺をManagedにする、っていうのがなんとなくあまりないように見える。
Avatar
Iceman 14-Sep-21 09:07 AM
Azureはひたすらよくわからんですね。サービス仕様の統一感がないしサービス間のつながりもよくわからないです
👀 1
Avatar
Kishikawa Katsumi 14-Sep-21 09:10 AM
Azure混乱してますよね。ひとつひとつのサービスはよく言えばシンプルなのでManagedを諦めたら挙動はわかりやすいとかあるけど。
Avatar
Iceman 14-Sep-21 09:10 AM
たしかに1個のサービスがやたら高機能だったりしますね。
Avatar
Kishikawa Katsumi 14-Sep-21 09:10 AM
あとリソースグループの仕組みはとてもいいと思う。Gもクリーンアップが簡単にできてほしい。
Avatar
omochimetaru 14-Sep-21 09:32 AM
-Ounchecked をdeprecatedにするって話があったと思うんですけど、いま調べ直したら特に確定的な事は出てこなくて、どうなったんでしたっけ
Avatar
koher 16-Sep-21 03:45 AM
@swift-5.4.3
func main() { let a: Int??? = 42 print(a as Any) guard let a = a else { return } print(a as Any) guard let a = a else { return } print(a as Any) guard let a = a else { return } print(a) } main()
Avatar
swift54 BOT 16-Sep-21 03:45 AM
Optional(Optional(Optional(42))) Optional(Optional(42)) Optional(42) 42
Avatar
koher 16-Sep-21 03:45 AM
素晴らしい。
Avatar omochimetaru
-Ounchecked をdeprecatedにするって話があったと思うんですけど、いま調べ直したら特に確定的な事は出てこなくて、どうなったんでしたっけ
Avatar
koher 16-Sep-21 03:48 AM
これはなんか、 deprecated にしようぜって話が出たけど結局決まらないままだった気がします。ただし、その後ウォッチしてないので新しい話が出てたらわからないです。
(とりあえず AtCoder の Swift に付いてる -Ounchecked を取り除きたい・・・)
Avatar koher
これはなんか、 deprecated にしようぜって話が出たけど結局決まらないままだった気がします。ただし、その後ウォッチしてないので新しい話が出てたらわからないです。
Avatar
omochimetaru 16-Sep-21 03:53 AM
そうなのかー 調べたら根拠らしきもの見つけられなかったので、そうっぽい。
Avatar
koher 16-Sep-21 03:54 AM
-Ounchecked 自体はパフォーマンス追求するなら必要なんじゃないのかなぁ。分岐予測とかでほぼカバーできるにしても。ただ、 99% のケースでは不要。少なくとも AtCoder には要らない・・・。
Avatar
omochimetaru 16-Sep-21 03:55 AM
仕組みとして必要なんですけど -remove-runtime-asserts などの指定があるので
-O ファミリーである必要はないと思うんですよね。
最適化レベルは他の副作用も多く含むので
logic failure時の安全機構の除去は、最適化とは別のスイッチになってるのが良いと思う。
最適化と、安全性の除去は、分けておく。 (edited)
Avatar
koher 16-Sep-21 03:58 AM
うーん、 -Onone かつ -remove-runtime-asserts がユースケースとしてあり得るのかや、 assert-O で消えることとの一貫性とか考えると最適化の一種じゃないのかなぁ。 (edited)
Avatar
omochimetaru 16-Sep-21 03:58 AM
-Osize はあり得ると思います
Avatar
koher 16-Sep-21 03:59 AM
最適化と、安全性の除去は、分けておく。
このとき assert については -O で消える?消えない?
Avatar
omochimetaru 16-Sep-21 03:59 AM
最適化は、こう書き換えても同じだよね、ってときにやることで、 そんときに、とにかく速度を目指すか、コードサイズ肥大は避けるか、という戦略はユースケース次第
assertは安全性は提供しないですね
preconditionFailureはNeverなんですけど
assertionFailureはNeverじゃないんです
よってassertレベルは、デバッグのために仕込むようで、ロジックとしては存在しない扱いというか・・・
ロジック上存在しない事になる分岐なので、安全性を提供できない。
preconditionは、残る前提なので、安全性を提供するために使う。 配列のインデックスアクセスが範囲内であるかの検査とかのレベル。
で、安全性を放棄するとき、preconditionレベルの分岐を消せる。
assertレベルは開発中のバグ出し用で、preconditionレベルは出荷製品のメモリ安全性を担保する用
Avatar
koher 16-Sep-21 04:03 AM
そうだなぁ。そうすると -remove-runtime-assertsassert ではなく precondition を消すためのものというのが明確だといいかなぁ。
Avatar
omochimetaru 16-Sep-21 04:04 AM
あれ、もしかして、 remove-runtime-asserts
assert を消すだけのものなのかしら? (edited)
オプション名からはめっちゃそう見える。。
def RemoveRuntimeAsserts : Flag<["-"], "remove-runtime-asserts">, Flags<[FrontendOption]>, HelpText<"Remove runtime safety checks.">;
名前が悪そうだなあ
-remove-safety-checks のほうがよくね?
Avatar
koher 16-Sep-21 04:05 AM
assertprecondition の名前は混乱していて、 Array のインデックスチェックは precondition ではなくインターナルななんとか assert 関数が呼ばれてたような気がする。
そういう意味で、 precondition も広義の assert の一種なのでは。
Avatar
omochimetaru 16-Sep-21 04:06 AM
stdlibの中のassertは外界でいうpreconditionみたいな
感じでしたっけ。
Avatar koher
そういう意味で、 precondition も広義の assert の一種なのでは。
Avatar
omochimetaru 16-Sep-21 04:06 AM
そうかもしれない
Avatar
koher 16-Sep-21 04:15 AM
あれー、記憶と違うな。 _precondition になってる。
@inlinable @inline(__always) internal func _checkValidSubscript(_ index: Int) { _precondition( (index >= 0) && (index < immutableCount), "Index out of range" ) }
https://github.com/apple/swift/blob/main/stdlib/public/core/ContiguousArrayBuffer.swift#L589-L596
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
しかも6年前からそのままだ。
Avatar
koher 17-Sep-21 03:48 PM
@fushiroyama そこはRustのResultとかOption! あとHaskellのEitherみたいな偉大な先駆者がいるので要チェックです。
@nobu_k @fushiroyama Haskellにはdo記法がありますし、Rustも?がありますが、そういう道具のない言語だと、EitherやResult中心のエラーハンドリングはボイラープレートだらけになりませんか?try-catchは一種のdo記法のようなものではないでしょうか?
@koher @fushiroyama 自分はミドルウェアや分散システムにおけるサービスの開発がメインなのですが、まともなエラー報告やロギングをしようと思うと例外やRustのResultがあっても結局if err != nilとあまり変わらないコードになっていくと言う印象です。分野によるとは思います。
@nobu_k @fushiroyama たしかに、細かく場合分けしてエラーハンドリングすることが求められるなら、あまり変わらなさそうですね。おっしゃるように、do記法やtry-catchが活きるかは分野によりそうです。
Avatar
omochimetaru 17-Sep-21 03:51 PM
Swiftのtry-catchを知らないから (edited)
Haskellのdo記法を肯定してるのにtry-catchを否定する意見になってるんじゃないですかね?
Avatar
tarunon 17-Sep-21 03:52 PM
概念的には完全に同じなので、知らないだけだと思いますね
Avatar
omochimetaru 17-Sep-21 03:52 PM
JavaやC#風(Rubyもかも?)のtry-catchを想定して発言してるように見える。
Avatar
koher 17-Sep-21 03:53 PM
いや、そういう話じゃなくて、一つ一つの処理で発生しうるエラーごとに異なるハンドリングが必要な分野では、結局 do 記法的なものがあってもなくても対して変わらないって意見じゃないかな?
それが求められるなら確かにそうだと思うんよね。結局一つずつ catch して適切なエラーに包んで投げるとか、ログを吐くとか。
Avatar
tarunon 17-Sep-21 03:54 PM
一行ずつのエラーの取り扱いが違うからって事ですよね
Avatar
koher 17-Sep-21 03:54 PM
はい。
Avatar
omochimetaru 17-Sep-21 03:54 PM
いわゆるred-green flowにならないから要らないという理屈は通りますね。
Avatar
tarunon 17-Sep-21 03:54 PM
その場合においてもResultとerr!=nilを同一視は、後者は型検査として一段落ちるから微妙な気はするけど (edited)
do記法が役に立たない分野がある、は確かに有り得るなと思いました
Avatar
koher 17-Sep-21 03:56 PM
型検査として一段落ちるのはそうだけど、 do 記法や try - catch がボイラープレート削減に寄与しないことがあるのはありえそう。
たるのんさんと同じことを繰り返しただけになってしまった。
Avatar
tarunon 17-Sep-21 03:56 PM
一応、一行ずつのエラーの型が異なれば、例外処理をまとめてパターンマッチに落とすという書き方が出来て
そうすると正常処理をまとめて読むことが出来るので正常系の可読性は良くなる(引き換えに異常系の可読性は一行毎のエラーの型についての知識が要求されて下がる)なので
どっちを取るかなんじゃないかと思いました
Avatar
koher 17-Sep-21 03:59 PM
そうですね。僕だったらパターンマッチにしなさそう。そして guard ... catch { } みたいなのほしくなりそう。
Avatar
tarunon 17-Sep-21 03:59 PM
僕は正常処理と異常処理で分けたいからパターンマッチかなぁ
Avatar
koher 17-Sep-21 04:00 PM
結局 Optional では都度書くしかないから、それだったらエラーもそれでいいかなと。まとめてハンドリングできるケースなら do - catch したいですが。
Avatar
tarunon 17-Sep-21 04:01 PM
まあそもtrycatchが本当に真価を発揮するのは非同期が混ざってきてからなんで
その辺も含めて考えますね
Avatar
koher 17-Sep-21 04:01 PM
I/O エラーみたいな何か一つやる度に発生して、どこで発生しても同じようにハンドリングすることが多いケースは do - catch が活きますよね。
クライアントサイドも、色んな種類のエラーが来てもログさえ吐けば、あとは大体同じというケースは多そうなので do - catch が活きそう。
Avatar
tarunon 17-Sep-21 04:03 PM
ただしHaskelを引き合いに出しつつ例外処理が違うとしてるのは、なんともやという感じではありますね
Avatar
koher 17-Sep-21 04:04 PM
そこはたしかに微妙ですね。ただ、元の話は Go だったので。
Avatar
tarunon 17-Sep-21 04:09 PM
mapErrorが行毎にシュッと出来る機能は欲しいのですよね
正確にはflatMapErrorか
Optionalの??に相当するオペレーター、ただしerrorを他のError型に変換するケースも有り得るみたいな
うーんでも、それなら一行毎のハンドリングでいいやってなるのかなぁ
Avatar
koher 17-Sep-21 04:18 PM
↓みたいに書きたくなりそうな気がするんですよね。
guard let x = try foo() catch { throw BarError(cause: error) }
Avatar
tarunon 17-Sep-21 04:19 PM
それはflatMapErrorに相当しますね
guardの左側でtryできるのが良さそう (edited)
うーん、伝わるかな…
Avatar
koher 17-Sep-21 04:20 PM
同じことしようとすると、今は
let x: Foo do { x = try foo() } catch { throw BarError(cause: error) }
になるのが辛くて・・・。
Swift は Java の try - catch を改良したとはいえ、↑のパターンは解決できてないので guard - try - catch がほしい。
Avatar
omochimetaru 17-Sep-21 04:21 PM
ちょっと考えたけど、
分野によってはred-greenにならないっていう主張は、僕は成立しないと思います
Avatar
koher 17-Sep-21 04:22 PM
guard let x = try? foo() else { throw BarError() }
はできるけど cause がとれない。
Avatar
omochimetaru 17-Sep-21 04:22 PM
なぜなら、普通に抽象化していけば
実現したい処理に名前をつけて関数化して、それに対して、途中でそれを阻害する失敗原因が複数ある、っていう形に整理されるからです
局所的に復帰するパターンについては、
その復帰も含めて閉じ込められるので、結局その外側はred-greenになるはずだし
ログを出すとかも、別にエラーをthrowした先でログを出すとか出さないとか、どういうログを出すかを、エラーごとに切り替えられるんで
結局そこでred-greenの全体構造は変わってないし。
もし、そうならない分野があるとしたら
アルゴリズムを実装してる部分とかぐらいじゃないですかね
ソートアルゴリズムとか実装してるときにその内部のフロー制御はエラー制御は出てこないけど複雑な分岐や遷移がある。
組み込み系だからというのも成り立たないと思っていて
Linuxのカーネルのソースコードとかも
Avatar
tarunon 17-Sep-21 04:24 PM
それを常にできる人ならtrycatchがあればなお良いというのは理解できるし、世の中の大半の人間にはそれは無理で、そして問題を解くにあたってそこまでやるのはオーバーキルだから、一行毎のチェックで良いんじゃいというのも、理解は出来るよ (edited)
Avatar
omochimetaru 17-Sep-21 04:24 PM
正常系に名前をつけてエラーが横にそれていく設計になっていると思う。みたことがある限りでは。
Avatar
tarunon 17-Sep-21 04:25 PM
ただまぁ、そうだとしても、error!=nilは、サボったらコンパイルエラーになって欲しいけどねw
Avatar
omochimetaru 17-Sep-21 04:25 PM
検査例外はチェックを忘れない位置行ごとのチェックと同じなので
毎回ifで分岐するスタイルの優位性はやっぱり全く無いと思う
Avatar
tarunon 17-Sep-21 04:26 PM
それはその通りだと思いますよ
Avatar
omochimetaru 17-Sep-21 04:26 PM
Swiftに関して言えば、throwsがuntypedだから
その点でtyped errorなResultモナドのほうが良い、って事はあると思うけど
それもやっぱりtry-catch一般論とは別の話でSwiftの実装がそうなってるってだけなので。
Avatar
koher 17-Sep-21 04:27 PM
red-greenって何?ググったけど見つからない・・・。
Avatar
omochimetaru 17-Sep-21 04:28 PM
JSでPromiseが流行り始めたときによく言われてたやつですね
いわゆるtry-catchの挙動を、そう名前をつけて説明してる文章がたくさんあった
↑こういうの
Avatar
tarunon 17-Sep-21 04:29 PM
うおおdo構文そのものだ!!!
Avatar
omochimetaru 17-Sep-21 04:31 PM
誰が言い始めたんだろう、railway oriented って言葉のほうが正しいのかな
↑のブログにも同じ図がのってる (edited)
Avatar
koher 17-Sep-21 04:32 PM
なるほど。言いたいことはわかったと思う。
Avatar
omochimetaru 17-Sep-21 04:32 PM
まあ、こういう制御フローをやりたいときに、try-catch構文はマッチするというのが僕の主張の前提で
で、こういう制御フローにしたくない分野なんてないんじゃないか、と思ったということです。
Avatar
koher 17-Sep-21 04:34 PM
たとえば X をするために A, B, C という処理が必要で、それぞれエラーを起こしうる処理で、それらのエラーを読み替えて X の文脈におけるエラーに変換したいみたいな場合に、 try - catch でボイラープレート削減ができないんじゃないかなと。
Avatar
omochimetaru 17-Sep-21 04:35 PM
個別にcatchして変換してもいいし、まとめてcatchして変換を一括して書いてもいいんじゃ?
Avatar
koher 17-Sep-21 04:35 PM
func x() throws { do { try a() } cathc { throw XError.foo(cause: error) } do { try b() } cathc { throw XError.bar(cause: error) } do { try c() } cathc { throw XError.baz(cause: error) } }
みたいな。
Avatar
omochimetaru 17-Sep-21 04:36 PM
それでもifで書くよりいいですよね。catch忘れがないんだから。
Avatar
tarunon 17-Sep-21 04:36 PM
try catchの役割はボイラープレート削減だけではなく
って書かれてた
検査例外が機能してる言語が少なすぎて
世の中の大半のプログラマーの例外処理がJavaかJavaScriptのイメージになってて、良いものと思って貰えないというのは
間違いなくあるでしょうね
Avatar
koher 17-Sep-21 04:40 PM
Go の方式はチェック忘れが起こり得るけど、 Result なら
func x() -> Result<X, XError> { guard case .success(let a) = a() else { return .failure(XError.foo) } guard case .success(let b) = b() else { return .failure(XError.foo) } guard case .success(let c) = c() else { return .failure(XError.foo) } return .success(.init(a, b, c)) }
みたいな場合には忘れることは起こらなくない?
Avatar
tarunon 17-Sep-21 04:40 PM
ResultはGoのそれよりずっと良いと思いますよ
Avatar
koher 17-Sep-21 04:41 PM
↑が求められるケースでは do - try - catch はあまり役に立たない。
という話なのかなと。
Avatar
omochimetaru 17-Sep-21 04:41 PM
パターンマッチで毎回 case success ってかいてるところがノイズだと思います。
恩恵が相対的に小さいのはそうだと思います。
あとResultはsuccessがvoidの場合にチェック忘れがありえます。
Avatar
tarunon 17-Sep-21 04:42 PM
一行毎にtry-catchするシーンにおいてguardが欲しくなるは、なるほどあるなぁ。それがないと、ネストがどんどん深くなるや
Avatar
koher 17-Sep-21 04:42 PM
で、そういうコードばっか書いてると try - catch 要らなくない?って発想になるのかなと。
Avatar
omochimetaru 17-Sep-21 04:43 PM
あー1ステップは3行になってるのは良いところですね。
Avatar
koher 17-Sep-21 04:43 PM
(なので、それについては guard let a = try a() catch { ... } がほしい。) (edited)
Avatar
omochimetaru 17-Sep-21 04:44 PM
ただそれに関しても
try recover { try a() } catch: { throw XError.foo(cause: $0) }
こういう高階関数を書けば2行にできるしなあ
まあそれだったらtryでもResultでも同じと言えるか。 (edited)
なるほど。guard - catch は良さそう。
else の代わりに catch キーワードを使えるんですね。
Avatar
koher 17-Sep-21 04:45 PM
うん、なので、 try でも Result でも変わらないようなコードってのはあって、その Result の劣化版として if のチェックでも対して困らないよって考えはまああり得るのかなと。
Avatar
omochimetaru 17-Sep-21 04:46 PM
try でも Result でも変わらないようなコードってのはあって
ここまでは納得できるけど
その Result の劣化版として if のチェックでも対して困らない
これはやっぱり同意できないですね。
Avatar
koher 17-Sep-21 04:46 PM
ただし、そういう分野ばかりではないから、 try - catchdo 記法がなくていいということにはならないと思う。
Avatar
omochimetaru 17-Sep-21 04:46 PM
劣化でしかないのはそうだし。
Avatar omochimetaru
その Result の劣化版として if のチェックでも対して困らない
これはやっぱり同意できないですね。
Avatar
koher 17-Sep-21 04:47 PM
まあそりゃそうだけどさ、それを言い始めたらまず null safety が、とかなっちゃうし😅
null safety を諦めてる環境なら、そこを諦めるのも似たような話な気がする。
Avatar
omochimetaru 17-Sep-21 04:48 PM
例外も継承も使わなくなって何年も経つけど、むしろ両方とも無い方が良いと思うようになった。
「無いほうが良い」になる理屈にはなってないと思います。
「無くても良い」ならわかる。
「言語組み込み文法が多いとeasyではあるがsimpleではないので習得が難しいので無いほうが良い」という主張なら有り得そうだけど、この人は10年やってるらしいのでそういうレベルの負担はないだろうし。
Avatar
koher 17-Sep-21 04:49 PM
そうだね。そこは非検査例外に引きずられてると思う。
JS とかの非検査例外しかない環境がヤバイのは間違いなくて、それを悪とみなしたらそういう発想になりそう。一方で、検査例外は Java しか知らないから構文が悪いせいでやっぱり悪と考えてしまう。
Avatar
omochimetaru 17-Sep-21 04:50 PM
はい、そういう感じの立ち位置だと思います。
Avatar
koher 17-Sep-21 04:52 PM
ただ、どうせ行ごとにハンドリングしなきゃいけないから do 記法的なもの( try - catch を含む)があまり有効でない世界というのはあまり考えたことがなかったなと。
Avatar
omochimetaru 17-Sep-21 04:53 PM
なるほど
Avatar
koher 18-Sep-21 01:26 PM
昨日ここで Haskell の do 記法と throws / try の話をしていたら、偶然だけど今日 inamiy さんが iOSDC で do 記法と async / await の話をしていた。 https://speakerdeck.com/inamiy/iosdc-japan-2021
Swift 5.5 async/await を支えるモナド、継続、コルーチン by 稲見 泰宏 | トーク | iOSDC Japan 2021 #iosdc - fortee.jp https://fortee.jp/iosdc-japan-2021/proposal/9e810800-1829-493b-891f-f80e80bcbdac
Avatar
tarunon 25-Sep-21 07:30 AM
apple/swift-format、swift5.5のリリース版使ってもthrowable getterを破壊してくるなw
😇 2
Avatar
omochimetaru 01-Oct-21 02:21 AM
public static subscript<EnclosingSelf: AnyObject>( _enclosingInstance object: EnclosingSelf, wrapped wrappedKeyPath: ReferenceWritableKeyPath<EnclosingSelf, Value>, storage storageKeyPath: ReferenceWritableKeyPath<EnclosingSelf, Published<Value>> ) -> Value {
この、PropertyWrapperが、プロパティを持ってる外側の型にアクセスする機能、 SE0258でfuture directionsに書いてある機能なんですけど、 OpenCombineですでに利用されてるの、いつ入ったんでしょう?
アンスコが付いてるから、非公式に隠れで入ってる?
Avatar
kateinoigakukun 01-Oct-21 02:23 AM
かなり前に書いた覚えがある
Avatar
Iceman 01-Oct-21 02:23 AM
本人登場
Avatar
kateinoigakukun 01-Oct-21 02:24 AM
Combine本体でも使われてるはず
Avatar
Iceman 01-Oct-21 02:24 AM
どこでこれ見つけたんですか?
Avatar
omochimetaru 01-Oct-21 02:24 AM
SwiftUIは @_disfavoredOverload みたいに裏技使うから、SwiftUIのためにこっそり入ってたんかね
Avatar
kateinoigakukun 01-Oct-21 02:27 AM
swiftinterfaceをこっそり見たんですかねぇ
Avatar
Iceman 01-Oct-21 02:27 AM
https://github.com/apple/swift/blob/3fc18f3603d9d99e2fe456c532e8f9201bcd1f18/stdlib/public/Concurrency/TaskLocal.swift#L185-L193 static varにしかつけられないPropertyWrapperを定義できるのか、面白い (edited)
Avatar
kateinoigakukun 01-Oct-21 02:27 AM
Neverなるほど
Avatar
omochimetaru 01-Oct-21 02:28 AM
裏技すぎない?
それでいいのか??w
いや、これは潰してるだけだからいいのか?
Neverがあるとstatic限定になる特別なルールがあるわけじゃなくて
Neverに固定されてるからNever型以外のインスタンスプロパティに使えなくなっているだけか
Avatar
kateinoigakukun 01-Oct-21 02:30 AM
ぽいですね。賢い
setにだけunavailable付けられるんだ
Avatar
omochimetaru 01-Oct-21 02:39 AM
ほ〜
Avatar
kateinoigakukun 01-Oct-21 02:43 AM
というか、これどういうタイミングで気がついたんですか? (edited)
Avatar
omochimetaru 01-Oct-21 02:43 AM
@Iceman が気がついた
Avatar
Iceman 01-Oct-21 02:45 AM
Published 使ってたらこれがstructなのに違和感を覚えて、色々と気になってきてOpenCombineを調べてみたら見つけたって感じです
Avatar
kateinoigakukun 01-Oct-21 02:46 AM
なーるほど
Avatar
omochimetaru 01-Oct-21 03:07 AM
アイスマン「家庭くんはどこで見つけたんだ」 家庭くん「アイスマンはどこで気がついたんだ」
t_kusa 3
Avatar
nanashiki 01-Oct-21 08:06 AM
swift 5.5の#if for postfix member expressionsをapple/swift-format@0.50500.0でも壊してくる。configとかで制御できるのかな。// swift-format-ignoreで一旦はしのげますが
VStack { Text("something") #if os(iOS) .iOSSpecificModifier() #endif .commonModifier() }
がこうなりConsecutive statements on a line must be separated by a newlineエラーに
VStack { Text("something")#if os(iOS) .iOSSpecificModifier() #endif .commonModifier() }
Avatar
koher 23-Oct-21 12:38 AM
↓みたいな JSON 型が標準で提供されると便利そう。自由なフォーマットの JSON をコード側で扱いたいとき。 JSONSerialization と比べるとパフォーマンス悪いけど。
enum JSON { case number(Double) case boolean(Bool) case string(String) case array([JSON]) case object([String: JSON]) case null } extension JSON: Codable { init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let value = try? container.decode(Double.self) { self = .number(value) } else if let value = try? container.decode(Bool.self) { self = .boolean(value) } else if let value = try? container.decode(String.self) { self = .string(value) } else if let value = try? container.decode([JSON].self) { self = .array(value) } else if let value = try? container.decode([String: JSON].self) { self = .object(value) } else if container.decodeNil() { self = .null } else { throw DecodingError.dataCorrupted(.init(codingPath: decoder.codingPath, debugDescription: "Failed to interpret as a JSON value.", underlyingError: nil)) } } func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch self { case .number(let value): try container.encode(value) case .boolean(let value): try container.encode(value) case .string(let value): try container.encode(value) case .array(let value): try container.encode(value) case .object(let value): try container.encode(value) case .null: try container.encodeNil() } } }
let json = "[true]".data(using: .utf8)! let decoded = try JSONDecoder().decode(JSON.self, from: json) // .array(.boolean(true))
Avatar
omochimetaru 23-Oct-21 02:39 AM
JSONSerializationが返すAnyは辛いのでそれ欲しいっすね
Avatar
koher 23-Oct-21 03:07 AM
decode が特にパフォーマンス悪そうなんだけど、なんかもっといい方法あるかなぁ。
Avatar
tarunon 23-Oct-21 03:20 AM
JSONSerialization使った後にAnyをJSON型に再起でキャストする方が速かったりしそう
Avatar
koher 23-Oct-21 03:25 AM
そうなんですけど、それだと Codable の仕組みの上で実現できないんですよね〜。
Avatar
tarunon 23-Oct-21 03:26 AM
JSON型はいかなる場合においてもそれがJSONであればデコードに成功するものなので、無理にCodableに乗せる必要も無いのかな、と思いました
camelCaseとかやりたい場合はCodableになるか。でもそれぐらい。
Avatar
koher 23-Oct-21 03:30 AM
たとえば JSON をダウンロードしてそれを Firestore に入れたいときに Codable の仕組みを使いたいとか、 YAML に変換したいとか。
Avatar
yutailang0119 23-Oct-21 03:31 AM
前におもちとJSON型作る話して、同じようなのやった
Avatar
koher 23-Oct-21 03:31 AM
Codable に適合しつつも、 JSONSerialization を使った高速なデコードが提供されてたらいいのかな。
Avatar
tarunon 23-Oct-21 03:31 AM
そうですね
Avatar
yutailang0119 23-Oct-21 03:33 AM
Codableなレスポンスの中に不定なJSON stringが入ってるパターンで必要だった (普通そんなことないやろと思うけど)
Avatar
omochimetaru 23-Oct-21 03:33 AM
JSON parserから作って直接生成すれば速い
😅 2
Avatar
koher 25-Oct-21 10:26 AM
downloadTask の completion handler に渡される URL は
You must move this file or open it for reading before your completion handler returns. Otherwise, the file is deleted, and the data is lost.
という制約があるんですが、 https://developer.apple.com/documentation/foundation/urlsession/1411608-downloadtask 新しい download(...) async throws -> (URL, URLResponse) の場合ってどうなるんでしょう? API リファレンスには何も書いていない。 https://developer.apple.com/documentation/foundation/urlsession/3767355-download もし downloadTask と同じなら actor context の引き継ぎとかでキューに投入されてる間に消えてしまうし、そうでなければいつ削除されるんでしょう?
Avatar
Iceman 25-Oct-21 10:57 AM
手元で動かした感じだとTask抜けたあとも.tmpファイルずっと残ってますね
実物のディレクトリFinderで覗いてもずっと残ってる(SessionTaskのほうだとすぐに消える)
Avatar
koher 25-Oct-21 11:08 AM
なるほど。現実的には move して利用すると考えると問題ないのかもしれませんが・・・。逆に downloadTask のときにどうやってファイルの read/write が衝突しないようにすればいいのかも微妙ですね。
Avatar
koher 13-Nov-21 03:21 AM
@escaping が小文字始まりなのに @Sendable が大文字始まりなの気持ち悪い気が。
Avatar
omochimetaru 13-Nov-21 03:22 AM
それは初期に議論がありました 最初 @sendable だったけど、 protocol Sendable と同じ意味なら @Sendable のほうがよくない?という話になった
Avatar
koher 13-Nov-21 03:23 AM
そっちの気持ちもわかるけど、大文字 @ って Property Wrapper や Global Actor 等に限定されてたと思うのに、 @Sendable はそのルールを破ってる気がする。
Avatar
omochimetaru 13-Nov-21 03:24 AM
大文字のルールは型名のルールの方から来てるんでしょうね
Avatar
koher 13-Nov-21 03:25 AM
まあ、それもマーカープロトコルに紐付いていると考えればいいのか?
クロージャがプロトコルに適合できない以上、 Sendable 以外のマーカープロトコルが導入された場合には @Sendable 相当のものが必要になると考えられ、そうするとプロコトル名に @ を付けるのは合理的だし、 Property Wrapper や Global Actor の @ が型名から生成されることとも一貫性があるのか。
Avatar
omochimetaru 13-Nov-21 03:27 AM
あ、そうですね
まさにそのように他のマーカープロトコルでも同じ事になっていくぞ、という話もありました
Avatar
koher 13-Nov-21 03:27 AM
なるほど。
Avatar
koher 27-Nov-21 05:55 AM
@swift-5.5.3
var a = 2 var b = 3 print(a, b) (a, b) = (b, a) print(a, b)
Avatar koher
@swift-5.5.3
var a = 2 var b = 3 print(a, b) (a, b) = (b, a) print(a, b)
Avatar
swift55 BOT 27-Nov-21 05:55 AM
2 3 3 2
Avatar
koher 27-Nov-21 05:56 AM
swap の方がいいだろうけど、これでも書けたのか。
Avatar
koher 30-Nov-21 02:18 AM
NSErrorcode ではなく、あえて _code を使っているコードを見かけたのですが、どんな意図が考えられますか?公開できるコードではないので貼れないですが・・・。
Avatar
omochimetaru 30-Nov-21 02:25 AM
なんだこれ。確かに使えますね。
Avatar
niw 30-Nov-21 02:25 AM
ivar?
NSError *error; error->_code;
Avatar
omochimetaru 30-Nov-21 02:26 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
public protocol Error: Sendable { var _domain: String { get } var _code: Int { get } // Note: _userInfo is always an NSDictionary, but we cannot use that type here // because the standard library cannot depend on Foundation. However, the // underscore implies that we control all implementations of this requirement. var _userInfo: AnyObject? { get } #if _runtime(_ObjC) func _getEmbeddedNSError() -> AnyObject? #endif }
Swift.Error って空じゃないんだ・・・
Xcodeからは見えない
NSError._code じゃなくて、
Error._code が隠しパラメータとして存在していて
NSError is Error だから、 NSError のじゃなくて Error_code を見ているのかも
Avatar
koher 30-Nov-21 02:42 AM
そういうことか。 ErrorNSError にしたときに Error_codecode として使うのか。
Avatar
omochimetaru 30-Nov-21 02:45 AM
あ〜だから、NSError化したときにどうなってほしいか、これを使えばコントロールできるのか。
👍 1
Avatar
Iceman 30-Nov-21 02:54 AM
NSError化したときにどうなってほしいか
これは CustomNSError が用意されてるので違うような気もしますね
Avatar
omochimetaru 30-Nov-21 02:56 AM
正規の方法はそっちか。
Avatar
d_date 30-Nov-21 10:00 AM
このハック使ったことあるんだけど、なんで使ったのか思い出せない
Avatar
Kishikawa Katsumi 07-Dec-21 08:49 AM
@norio_nomura Herokuのスペア(オフロード先?)として https://render.com/ はよさそうです。Herokuと同様にDockerFileをマルッとデプロイできてFreeプランの制限も似たような感じでした。
Render is a unified cloud to build and run all your apps and websites with free TLS certificates, global CDN, private networks and auto deploys from Git.
Avatar Kishikawa Katsumi
@norio_nomura Herokuのスペア(オフロード先?)として https://render.com/ はよさそうです。Herokuと同様にDockerFileをマルッとデプロイできてFreeプランの制限も似たような感じでした。
Avatar
norio_nomura 07-Dec-21 08:50 AM
お、チェックしてみます。
ストレージが従量なのかな?
Avatar
Kishikawa Katsumi 07-Dec-21 08:52 AM
あ、そこはみてないですね。永続Diskが必要な場合はたぶん別途費用が発生しますね。イメージに収まらないDiskがありますか?
ステートレスだと思っていました。
Avatar
norio_nomura 07-Dec-21 08:54 AM
コンテナのサイズが従量課金対象外になってるなら使えますね。 (edited)
Avatar
Kishikawa Katsumi 07-Dec-21 08:57 AM
大丈夫じゃないかな。あまりそこに制限がある(物理的な制限はある)サービスは見ないですね。 https://swift-ast-explorer.com/ をさっき移行して様子を見ています。だいたいこれで1.3GBくらいのイメージサイズのはず。
Visualize Swift AST and select nodes within the editor, a great way to learn about the structure of Swift syntax trees.
Avatar
norio_nomura 07-Dec-21 09:02 AM
FreeだとRAM 256MBですが、Swiftコンパイラ動きますか? https://render.com/pricing/#services (edited)
Render is a unified cloud to build and run all your apps and websites with free TLS certificates, global CDN, private networks and auto deploys from Git.
🤔 1
Linkerが頑張ったりしなければ問題ないのかな。
Avatar
kateinoigakukun 07-Dec-21 09:04 AM
Firebase Functionsでコンパイラ動かしたときは少なくとも1GBくらい必要でした
t_kusa 1
Avatar
norio_nomura 07-Dec-21 09:06 AM
今Botが動いてるHerokuはRAM 512MBだった。
Avatar
kateinoigakukun 07-Dec-21 09:07 AM
おお、そんなもんで動くんですね。環境によるのかな
Avatar
Kishikawa Katsumi 07-Dec-21 09:10 AM
コンパイルどうかなあ。SwiftFiddleだと128 MB memory limitでDockerを制限して起動しているけど動いてますね。
ホストもAve 128Miでスケールするような設定にしているけどそこがスケール必要な事態はそんなに起こってないんですよね。ということはこのDiscordで使われてるくらいなら問題ないんじゃないかな。
Avatar
norio_nomura 07-Dec-21 10:34 AM
とりあえず、Heroku同様にWeb無しWorkerのみインスタンスを作ろうとしたけど、全く詳細が表示されないエラーで失敗する…
Avatar
Kishikawa Katsumi 07-Dec-21 10:35 AM
ビルド(デプロイ)も動かないですか? (edited)
いや、デプロイはできて実行で失敗している、ということかな。
Avatar
norio_nomura 07-Dec-21 10:37 AM
ビルドが走ってそうな雰囲気もなく、即座に失敗します。 "Sync failed for Blueprint" っていうタイトルのメールが届く。
Avatar
Kishikawa Katsumi 07-Dec-21 10:39 AM
なんだろう。追加しようとしているのは「Web Service」ですか?
Avatar
norio_nomura 07-Dec-21 10:41 AM
"New Blueprint Instance"を選び、リポジトリとブランチを指定しています。
Avatar
Kishikawa Katsumi 07-Dec-21 10:43 AM
Dockerfile1つで完結するなら「Web Service」を選んでリポジトリとブランチを指定、でいいと思いますよ。 Health checkのEndpoint /healthz を用意するかそこの設定を変える必要はあるかもしれません。
Avatar
norio_nomura 07-Dec-21 10:52 AM
Web Service用のポートをリッスンしたりしないので、Dashboardから選ぶならBackground Workerですね。
そして、Background Workerを追加しようとするとクレジットカード入力を求められました。
Avatar
Kishikawa Katsumi 07-Dec-21 10:54 AM
ああ、そうですね。勘違いしていました。確かにBotを運用するならそうですね 🙏
Avatar
norio_nomura 07-Dec-21 10:55 AM
DashboardのWeb UIがありえないくらい遅いので、ちょっとまた後日試そう…な感じ。残念。 (edited)
Avatar
Kishikawa Katsumi 07-Dec-21 10:56 AM
私の環境だとWeb UIはむしろHerokuより速く動いてるような印象ですね。
Avatar
norio_nomura 07-Dec-21 11:04 AM
Web UIはページを開き直したら速くなりました。
Avatar
Kishikawa Katsumi 07-Dec-21 11:07 AM
なるほど。なんかHeroku Alternativeを自称しているくらいだからちょうどいいかと思いましたが、Botの運用には合わないですね。
Avatar
norio_nomura 07-Dec-21 11:15 AM
Pricingを見るとBackground WorkerもFreeで利用できるようにも読めるけど、Dashboardの挙動を見る限り$7/moなStarterが必要ぽいです。 https://render.com/pricing/#services
Avatar
Kishikawa Katsumi 07-Dec-21 11:16 AM
そのようですね。Freeが選べない。
Avatar
norio_nomura 07-Dec-21 11:17 AM
Web Serviceを使った非常駐型なBot(構想中)ならば使えそうな気がします。
Avatar
Kishikawa Katsumi 07-Dec-21 11:18 AM
RESTとWeb Socketによるものは使えました。スリープ時間もステータスチェックのサービスを使ってたら自然に起きるので問題はないですね。
Avatar
norio_nomura 07-Dec-21 11:21 AM
各アカウント宛のメンションを常駐監視する役割のボットを決めて、RESTで非常駐なボットを起こして〜みたいな感じにしようかと。
Avatar
Kishikawa Katsumi 07-Dec-21 11:21 AM
マイクロサービスっぽい。
Avatar
norio_nomura 07-Dec-21 12:18 PM
接続中のWeb Socketクライアントがいたらサーバーもsleepしない、とかだと面白いかも。>render.com
Avatar
Kishikawa Katsumi 07-Dec-21 12:21 PM
Free tierがあるだけで従量制だからスリープしないのはむしろありそう。
ブラウザから繋いでる分には普通にちょいちょい切れて再接続するので挙動を見るのは難しんですけども。
Avatar
koher 18-Dec-21 05:16 AM
guard try ... catch { ... } がほしい・・・。
t_wakaru 2
Avatar
omochimetaru 18-Dec-21 05:19 AM
例外まとめて投げるんじゃなくて、1行ごとにエラーハンドリングを細かく書きたい時にほしくなる (edited)
Avatar
koher 18-Dec-21 05:20 AM
let もできるといいよね。
guard let foo = try bar() catch { ... }
Avatar
omochimetaru 18-Dec-21 05:20 AM
let do catchだと5行かかって大変
Avatar koher
let もできるといいよね。
guard let foo = try bar() catch { ... }
Avatar
omochimetaru 18-Dec-21 05:21 AM
それを考えてました
Avatar
koher 18-Dec-21 05:21 AM
guard let が Optional Binding 以外に使われるのは微妙だけど、これ提案したら通らないかなぁ・・・。
Avatar
omochimetaru 18-Dec-21 05:22 AM
Optionalに落とし込む高階関数を作って、それをguardと一緒に使う手はあるかなあ
たまに考えるんだけどたまにしか出てこないからやらながち
Avatar
koher 18-Dec-21 05:22 AM
guard let foo = try? bar() else { ... }
はできるけど、エラーが取れないんよね。
Avatar
omochimetaru 18-Dec-21 05:23 AM
ですね。形は近いけど機能が足りない
Avatar koher
guard let が Optional Binding 以外に使われるのは微妙だけど、これ提案したら通らないかなぁ・・・。
Avatar
omochimetaru 18-Dec-21 05:24 AM
普通にパターンとしてはあると思うので欲しい人は居るかも?
Avatar
koher 18-Dec-21 05:27 AM
時間ができたら過去ログ漁って、なかったらForumに書いてみるか。 (edited)
Avatar
kebo 18-Dec-21 01:18 PM
行数的にはシンプルな形なら
let foo: T do { foo = try bar() } catch { ... }
で済むのであんまりメリットなさそうですけど,型名を省略できるというメリットならありそうですね.
(edited)
Avatar
omochimetaru 19-Dec-21 02:33 AM
guardはelse節で脱出を強制されているメリットもあると思います。 (edited)
Avatar
kebo 19-Dec-21 12:36 PM
確かにそれはありますね.一方で do catch だとエラーの型に応じて catch を分けることができますが,guard の場合もそれをやろうと思うと構文が複雑になっちゃいそうで,else 節 (catch 節?) 一つにまとめてしまうとその中で switch で分岐させないといけなくなったりしそうですね.
Avatar
omochimetaru 19-Dec-21 12:37 PM
guard let foo = try bar() else catch { switch error { case let FooError as error: print(...) default: print(...) } return }
こんなイメージです。
Avatar
kebo 19-Dec-21 04:28 PM
はい.それはイメージ合います. そして現状だと以下の 2 パターンがあると思いますが,let への代入前提の場合だと結局これらでも代入か脱出を強制されているので,guard とあまり変わらなさそうですね.(型を省略できる以外は)
let foo: T do { foo = try bar() } catch let error as FooError { print(...); return } catch { print(...); return }
let foo: T switch Result(catching: { try bar() }) { case .success(let value): foo = value case .failure(let error as FooError): print(...); return case .failure(let error): print(...); return }
Avatar
omochimetaru 19-Dec-21 04:39 PM
docatch を複数繋げられるの知りませんでした! 確かに初期化拒否すると脱出が強制されるのはそうですね。なるほど。
Avatar
Kishikawa Katsumi 26-Dec-21 06:05 AM
@swift-5.4.3
let foo = true let bar = true outer: if foo { if bar { print("bar") break outer } print("not bar") } print("end")
Avatar Kishikawa Katsumi
@swift-5.4.3
let foo = true let bar = true outer: if foo { if bar { print("bar") break outer } print("not bar") } print("end")
Avatar
swift54 BOT 26-Dec-21 06:05 AM
bar end
Avatar
Kishikawa Katsumi 26-Dec-21 06:05 AM
知らんかった。Swiftもラベルに飛ぶってあるんですね。
Avatar
omochimetaru 26-Dec-21 08:45 AM
実はありますね
これのせいで、複数後置クロージャの第二クロージャの文法が出た時に、ラベル構文と干渉しないのか?って議論がありました (edited)
Avatar
Kishikawa Katsumi 26-Dec-21 08:46 AM
おお、干渉しないんだ。
外側に来ないから干渉しないのかな。
いや、そもそもラベルってどこでも書けるのかな。
Avatar
omochimetaru 26-Dec-21 08:48 AM
どうだったかな? なんか紛らわしいパターンは生まれてる気がする どういう解釈になるかが固定されただけで
Avatar
Kishikawa Katsumi 26-Dec-21 08:53 AM
すぐ下にスコープがある場合に書けるっぽいな。
@swift-5.4.3
https://swift.org do { print("OK") }
(edited)
Avatar Kishikawa Katsumi
@swift-5.4.3
https://swift.org do { print("OK") }
(edited)
Avatar
swift54 BOT 26-Dec-21 08:54 AM
OK
Avatar
Kishikawa Katsumi 26-Dec-21 08:55 AM
なるほど。
Avatar
Kishikawa Katsumi 26-Dec-21 09:03 AM
DispatchQueue.main.async { [weak this = self] in ... }
キャプチャにその場で名前つけられるっていうのも知らんかった。 ブラウザの古いタブを整理していて知らないTipsがいろいろ見つかった。
Avatar
omochimetaru 26-Dec-21 09:06 AM
キャプチャ時の命名って右辺値にどんな式でも書けるのかな
Avatar
Kishikawa Katsumi 26-Dec-21 09:08 AM
足し算は書けた。なんでもかけるんじゃない?
😯 1
print()も書けたから関数呼び出しもかける
つまりキャプチャするために一時変数に入れるっていうのをしたいわけだけど、その一時変数のスコープを不要に長くしなくて済むってことだな。
DispatchQueue.main.async { [foo = self.foo, bar = self.bar] in ... }
というのを典型的な利用例だと思うけどこの場合selfはキャプチャされない、でいいのかな?
Avatar
Iceman 26-Dec-21 09:50 AM
そのはずですね。また [foo, bar] と省略してかけます
IUOはOptionalになってしまうので、 [foo = foo!] という感じになります
Avatar
omochimetaru 26-Dec-21 09:55 AM
右辺値側はクロージャを作るコンテキストで評価されるんですね。なるほどなるほど。
Avatar
Kishikawa Katsumi 26-Dec-21 10:21 AM
あ、そうか。プロパティならそもそもそれでいいのか。
Avatar
Kishikawa Katsumi 26-Dec-21 10:08 PM
Raw String Literal、ダブルクオートをエスケープしなくていいのは便利だけどそんなに読みやすくない。。。Xcodeが外と中で色を変えてくれるといいんだけど。
それかRubyやJSみたいに全然違う記号を使えるほうがよかったな。
Avatar
d_date 05-Jan-22 07:54 AM
Runtime warningが出せるのも面白いし、パラメータを探っていくのも面白かった https://www.pointfree.co/blog/posts/70-unobtrusive-runtime-warnings-for-libraries
Runtime warnings in libraries are a great way to notify your users that something unexpected has happened, or that an API is being used in an incorrect manner. In this post we give an overview of some techniques that can be employed easily today, as well as discuss a technique for surfacing runtime warnings that is both very visible and unobtrus...
Avatar
tarunon 05-Jan-22 07:55 AM
それ使えるんだ
Avatar
Kishikawa Katsumi 05-Jan-22 07:55 AM
なんかに使えそうだよね
Avatar
tarunon 05-Jan-22 08:04 AM
許容できない入力をエラーに落としつつIDEからも警告出すのは普通に良さそう
Avatar
Kishikawa Katsumi 05-Jan-22 08:05 AM
コンソールに出すよりいいな
Avatar
tarunon 05-Jan-22 08:06 AM
悪いところがはっきりするから体験良いですよね
止めずに使えるブレークポイントの感覚
Avatar
d_date 05-Jan-22 08:20 AM
公式のAPIはよう
Avatar
kateinoigakukun 05-Jan-22 08:27 AM
os_logの仕組みなんすね
ハッキーだけどdsoでログの発生源騙すくらいなら許容できそう
Avatar
d_date 05-Jan-22 08:29 AM
この様子だとまだなんかos_logでできそうだよね
Avatar
kateinoigakukun 05-Jan-22 08:30 AM
ありそう
Avatar
Kishikawa Katsumi 14-Jan-22 06:39 AM
https://discord.com/channels/291054398077927425/420754624975339520/894810082120974376 @niw さんに教えてもらったこのプログラム、昨日返事が届いて承認されました 🎉 タダにはならないけど少しの金銭的な援助が受けられることになりました。
🎉 1
Avatar Kishikawa Katsumi
https://discord.com/channels/291054398077927425/420754624975339520/894810082120974376 @niw さんに教えてもらったこのプログラム、昨日返事が届いて承認されました 🎉 タダにはならないけど少しの金銭的な援助が受けられることになりました。
Avatar
niw 16-Jan-22 03:30 AM
やったー
Avatar
Kishikawa Katsumi 12-Feb-22 12:59 PM
そういえばこのDiscordはおそらくスレッドがAtcoderチャンネル以外では使われてない(あとはスレッドの導入初期にテスト投稿があるだけ)
Avatar
yutailang0119 17-Feb-22 01:12 PM
これって話題になってたっけ? https://twitter.com/cockscomb/status/1494243453013610502
URLSessionのConcurrencyなAPIってiOS 13までバックポートされようとしてるのかな https://t.co/AT6nVLuuZa
👀 1
Avatar
omochimetaru 17-Feb-22 01:13 PM
しらんかった
Concurrency はバックポートあるけどiOS SDK APIは無いから自前実装だねって話だったけど (edited)
このへんもバックポートされたら便利だな
Avatar
yutailang0119 17-Feb-22 01:19 PM
今日教えてもらったんだけど、こういうが関係するのか、Xcode 13.3をインストールすると、iOS 12.4のシミュレータが使えなくなるらしい https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-13_3-release-notes
Avatar
lovee 17-Feb-22 10:23 PM
そう言えば swift build とか swift test とかのようなXcodeプロジェクトが存在しない純粋なSwiftPMプロジェクトって、何か xcresult もしくはそれに準ずるビルド結果の出力ってあるのかな 👀
Avatar
shiz 20-Feb-22 10:38 PM
Swift言語のワーキンググループの立ち上げを検討しているみたいですね👀 The intent is to free the core team to invest more in overall project stewardship and create a larger language workgroup that can incorporate more community members in language decisions. https://forums.swift.org/t/core-team-to-form-language-workgroup/55455 (edited)
Avatar
kateinoigakukun 20-Feb-22 10:41 PM
https://forums.swift.org/t/pitch-2-light-weight-same-type-requirement-syntax/55081/144
I'm sorry but I don't follow swift evolution and haven't been a part of the core team since middle of last year. I don't have enough context to have an informed opinion here.
えー
I'm sorry but I don't follow swift evolution and haven't been a part of the core team since middle of last year. I don't have enough context to have an informed opinion here. -Chris
Avatar
shiz 20-Feb-22 10:45 PM
それもびっくりでした😅 (edited)
Avatar
Kishikawa Katsumi 21-Feb-22 12:06 AM
Swift言語のワーキンググループ
他の言語もだいたいそうだけど、特定の会社の色(Swiftの場合はアップル)を消していく必要があるのでしょうね。
Swiftの現状を考えてもおそらくいい影響を与えるんじゃないかな。
Avatar
shiz 21-Feb-22 01:07 AM
> 他の言語もだいたいそうだけど、特定の会社の色(Swiftの場合はアップル)を消していく必要があるのでしょうね。
そうですね。社内事情(スケジュール)的な要因とは切り離して進めていけたら良いのではないかなと思ってます。(そうなっているとは限りませんが、最近(先週)Acceptされたプロポーザルたちは、なんかまとまる前に終了したような風に見えて、そこら辺が関係あるのかなと個人的には感じてます😅)
(edited)
Avatar
omochimetaru 21-Feb-22 01:12 AM
この前 @d_date も同じ意見を言ってたな
Avatar
Kishikawa Katsumi 21-Feb-22 01:12 AM
まあその辺のいろいろは感じるよね。ってなるとプロセスの信頼性というかマジメにレビューにコメントしたりProposalするのが徒労に感じてしまうみたいな影響が出てきそうなのも良くなくてそういうふうにならないように進むといいんじゃないかな。
Avatar
omochimetaru 23-Feb-22 02:08 AM
クリスラトナーが去年の夏からコアチームを離れた理由について質問されて回答しているんだけど コアチーム会議が攻撃的(toxic)で、ビデオ会議で侮辱されたり(insulted)怒鳴られた(yelled)が、リーダーが改善しなかった フォーラムはすぐ炎上する(more heat than light)、自分の形式的なレビューは一方的に無視される(ignored by the unilateral accepts)、 頑張っても特定人物とこじれるだけで時間の無駄(wasting my time) 自分が影響を与えられなくなった(outgrown my influence)、自分の重視する設計原則は考慮されなくなった などなど書かれていて残念すぎてヤバい・・・ https://forums.swift.org/t/core-team-to-form-language-workgroup/55455/6
Moderator note: this post was originally in the light-weight same-type requirement syntax thread, but only because this thread was locked. We have re-opened this thread and moved this post to separate it from the technical discussion in that thread. Someone asked for more information: I'm sorry but I don't follow swift evolution and haven't ...
Avatar
niw 23-Feb-22 02:09 AM
職場の心理的安全性…
Avatar
koher 23-Feb-22 03:31 AM
えー
Avatar koher
えー
Avatar
omochimetaru 23-Feb-22 03:59 AM
ラトナー自身AIチップ?の会社建てたり、やりたいことが他にもあるのはいいとして、 こんな理由でラトナーがSwiftから離脱するのめちゃくちゃ損失大きいですよね
フォーラムはなんだかんだヒートアップしても紳士的な感じだからちゃんとしてるなと思ったら、 コアチームのビデオ会議(WebEx)はそうではないっていうのも残念
Avatar
koher 23-Feb-22 04:04 AM
フォーラムはなんだかんだヒートアップしても紳士的な感じ
うん、そんな気がしてたから(英語力が足りなくてニュアンスがつかめてないのかも&最近フォーラムはあまり覗いてないからかもしれないけど)、コアチームの中がそんなことになってたのは意外・・・。
Avatar
Kishikawa Katsumi 23-Feb-22 09:49 AM
読んだ。Swiftの仕事はだいぶプレッシャーがキツそうだな。
Avatar
niw 23-Feb-22 06:29 PM
言われてますけど、Appleの秘密主義とか悪影響が凄そう
Avatar
koher 24-Feb-22 02:04 AM
Apple内コアチームメンバーが会社事情で進めたいことがあり、外部のコアチームメンバーはその事情は見えないから一般論で話し、衝突してお互いストレス感じる場面とか多そうですね。
Exported 9,268 message(s)